Require authorization for access to RSS feeds, but leave posts public

Based on the comments you can have several options. The easier one is to check for a special parameter at the URL, this assume you provide them the URL, and they configure it manually in whatever software the use to fetch the feed. For the example you give them the URL as mysite.com/feed?pass=123456 where pass is the secret parameter and 123456 is the correct value

add_action('init','wase_83868_init',1);
function wase_83868_init() {
  if (is_feed()) { // if access to RSS feed
    if (!isset($_GET['pass']) || ($_GET['pass'] != '123456'))
      wp_die('Only paying costumers can read the RSS feed',403); // failed check, reject
  }
}

You will probably also will want to remove the links to your RSS from your feed like suggested here

The problem with this option is that the secret is not much of a secret and you have to trust the people to whom you give it to not leak it. so another option can be to filter by IP address. instead of URL parameters.

add_action('init','wase_83868_init',1);
function wase_83868_init() {
  if (is_feed()) { // if access to RSS feed
    if ($_SERVER['REMOTE_ADDR'] != '192.132.14.12'))
      wp_die('Only paying costumers can read the RSS feed',403); // failed check, reject
  }
}

The ultimate option is to create a user and serve the RSS only to logged in users.

add_action('init','wase_83868_init',1);
function wase_83868_init() {
  if (is_feed()) { // if access to RSS feed
    if (!user logged in and have permission)
      wp_die('Only paying costumers can read the RSS feed',403); // failed check, reject
  }
}

The problem with this approach is that your costumer’s software will have to perform login before fetching the RSS to get the authentication cookies.