Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
READERS.CONF(5)		  InterNetNews Documentation	       READERS.CONF(5)

NAME
       readers.conf - Access control and configuration for nnrpd

IN A NUTSHELL
       The readers.conf	file parameters	who is allowed to connect as a news
       reader and what they're allowed to do after they	connect.  Bear in mind
       that in readers.conf, authentication and	authorization are configured
       in different blocks.  First, a user is authenticated, and assigned an
       identity	(in an "auth" block).  Then this identity is authorized	to
       access certain newsgroups with certain rights (in an "access" block).

       As for authentication, your "auth" block	for password users could look
       like this:

	   auth	"foreignokay" {
	       auth: "ckpasswd -f <pathdb in inn.conf>/newsusers"
	       default:	"<unauthenticated>"
	   }

       See the documentation of	the -f flag in the ckpasswd(8) man page	for
       how to generate passwords and make use of this newsusers	file.

       This way, with the "foreignokay"	authentication block, a	user
       successfully authenticated as user "myusername" will be assigned	the
       identity	"myusername".  If authentication fails,	it will	be assigned
       the default identity "<unauthenticated>"	that will later	be checked in
       "access"	blocks.

       Authentication blocks are checked from the last one in the readers.conf
       file to the first one (bottom up).  As soon as one matches, the
       corresponding identity is assigned to the user.

       As for authorization, let's do something	in an "access" block for
       people successfully authenticated with passwords:

	   access "authenticatedpeople"	{
	       users: "*"
	       newsgroups: "*,!junk,!control,!control.*"
	   }

       And then	something like one of the following two, depending on whether
       unauthenticated users get any access:

	   access "restrictive"	{
	       users: "<unauthenticated>"
	       newsgroups: "!*"
	   }

	   access "readonly" {
	       users: "<unauthenticated>"
	       read: "local.*"
	       post: "!*"
	   }

       Please note that	the "authenticatedpeople" block	must appear in
       readers.conf before "restrictive" or "readonly" blocks because access
       blocks are checked from the last	one in the readers.conf	file to	the
       first one (bottom up).  As soon as one matches the identity previously
       assigned	by an authentication block, it is chosen.  The
       "authenticatedpeople" access block matches every	user that has not been
       assigned	"<unauthenticated>" as identity.

       More examples and features are detailed below in	this man page (notably
       without any password file, with PAM, with Perl or Python	hooks).

       You don't need to reload	anything after modifying readers.conf; every
       time a news client connects to the server, a new	nnrpd process is
       spawned and reads its configuration from	disk.  Nonetheless, after any
       changes,	you can	run "inncheck" to perform basic	syntax checks against
       the modified readers.conf file.

DESCRIPTION
       readers.conf in pathetc specifies access	control	for nnrpd(8).  It
       controls	who is allowed to connect as a news reader and what they're
       allowed to do after they	connect.  nnrpd	reads this file	every time a
       news client connects to the server, even	when running in	daemon mode
       with -D,	which means that any changes on	this file take effect
       immediately on all subsequent connections.  (The	location of
       readers.conf in pathetc is only the default; the	same format applies to
       any file	specified with "nnrpd -c".)

       There are two types of entries in readers.conf: parameter/value pairs
       and configuration groups.  Blank	lines and anything after a number sign
       ("#") are ignored, unless the character "#" is escaped with "\".	 The
       maximum number of characters on each line is 8,191.

       Parameter/value pairs consist of	a keyword immediately followed by a
       colon, at least one whitespace character, and a value.  The case	of the
       parameter is significant	(parameter should generally be in all
       lowercase), and a parameter may contain any characters except colon,
       "#", and	whitespace.  An	example:

	   hosts: *.example.com

       Values that contain whitespace should be	quoted with double quotes, as
       in:

	   hosts: "*.example.com, *.example.net"

       If the parameter	does not contain whitespace, such as:

	   hosts: *.example.com,*.example.net

       it's not	necessary to quote it, although	you may	wish to	anyway for
       clarity.

       There is	no way to continue a line on the next line, and	therefore no
       way to have a single parameter with a value longer than about 8,180
       characters.

       Many parameters take a boolean value.  For all such parameters, the
       value may be specified as "true", "yes",	or "on"	to turn	it on and may
       be any of "false", "no",	or "off" to turn it off.  The case of these
       values is not significant.

       There are two basic types of configuration groups: auth and access.
       The auth	group provides mechanisms to establish the identity of the
       user, who they are.  The	access group determines, given the user's
       identity, what that user	is permitted to	do.  Writing a readers.conf
       file for	your setup is a	two-step process: first	assigning an identity
       to each incoming	connection using auth groups, and then giving each
       identity	appropriate privileges with access group.  We recommend	not
       intermingling auth groups and access groups in the config file; it is
       often more sensible (in the absence of the key parameter) to put	all of
       the auth	groups first, and all of the access groups below.

       A user identity,	as established by an auth group, looks like an e-mail
       address if a domain is specified	(like "<username>@<domain>") or
       otherwise just "<username>".

       If nnrpdauthsender is set in inn.conf, the user identity	is also	put
       into the	Sender header field of posts made by that user.	 See the
       documentation of	that option in inn.conf(5) for more details.

       An auth group definition	looks like:

	   auth	<name> {
	       hosts: <host-wildmat>
	       auth: <auth-program>
	       res: <res-program>
	       default:	<defuser>
	       default-domain: <defdomain>
	       # ...possibly other settings
	   }

       The <name> is used as a label for the group and is only for
       documentation purposes.	(If your syslog	configuration records the
       "news.debug" facility, the <name> will appear in	the debugging output
       of nnrpd.  Examining that output	can be very helpful in understanding
       why your	configuration doesn't do what you expect it to.)

       A given auth group applies only to hosts	whose name or IP address
       matches the wildmat expression given with the hosts parameter (comma-
       separated wildmat expressions are allowed, but "@" is not supported).
       Rather than wildmat expressions,	you may	also use CIDR notation to
       match any IP address in a netblock; for example,	"10.10.10.0/24"	will
       match any IP address between 10.10.10.0 and 10.10.10.255	inclusive.

       If compiled against the TLS/SSL or SASL libraries, an auth group	with
       the require_encryption parameter	set to true only applies if the
       incoming	connection is using an encryption layer, either	from the
       beginning if the	-S flag	was passed to nnrpd, or	after a	successful use
       of STARTTLS, or after a successful authentication using an SASL
       mechanism which negotiates an encryption	layer.

       For any connection from a host that matches that	wildmat	expression or
       netblock, each <res-program> (multiple res lines	may be present in a
       block; they are run in sequence until one succeeds), if any, is run to
       determine the identity of the user just from the	connection
       information.  If	all the	resolvers fail,	or if the res parameter	isn't
       present,	the user is assigned an	identity of "<defuser>@<defdomain>";
       in other	words, the values of the default and default-domain parameters
       are used.  If <res-program> only	returns	a username, <defdomain>	is
       used as the domain.

       If the user later authenticates via the AUTHINFO	USER/PASS commands,
       the provided username and password are passed to	each <auth-program>
       (multiple auth, perl_auth, or python_auth lines may be present in a
       block; they are run in sequence until one succeeds), if any.  If	one
       succeeds	and returns a different	identity than the one assigned at the
       time of the connection, it is matched against the available access
       groups again and	the actions the	user is	authorized to do may change.
       The most	common <auth-program> to use is	ckpasswd, which	supports
       several ways of checking	passwords including using PAM.	See the
       ckpasswd(8) man page for	more details.

       When matching auth groups, the last auth	group in the file that matches
       a given connection and username/password	combination is used.

       An access group definition usually looks	like:

	   access <name> {
	       users: <identity-wildmat>
	       newsgroups: <group-wildmat>
	       # ...possibly other settings
	   }

       Again, <name> is	just for documentation purposes.  This says that all
       users whose identity matches <identity-wildmat> can read	and post to
       all newsgroups matching <group-wildmat> (as before, comma-separated
       wildmat expressions are allowed,	but "@"	is not supported).
       Alternately, you	can use	the form:

	   access <name> {
	       users: <identity-wildmat>
	       read: <read-wildmat>
	       post: <post-wildmat>
	   }

       and matching users will be able to read any group that matches
       <read-wildmat> and post to any group that matches <post-wildmat>.  You
       can also	set several other things in the	access group as	well as
       override	various	inn.conf(5) parameters for just	a particular group of
       users.

       Just like with auth groups, when	matching access	groups the last
       matching	one in the file	is used	to determine the user's	permissions.
       There is	an exception to	this rule: if the auth group which matched the
       client contains a perl_access or	python_access parameter, then the
       script given as argument	is used	to dynamically generate	an access
       group.  This new	access group is	then used to determine the access
       rights of the client; the access	groups in the file are ignored.

       There is	one additional special case to be aware	of.  When forming
       particularly complex authentication and authorization rules, it is
       sometimes useful	for the	identities provided by a given auth group to
       only apply to particular	access groups; in other	words, rather than
       checking	the identity against the users parameter of every access
       group, it's checked against the users parameter of only some specific
       access groups.  This is done with the key parameter.  For example:

	   auth	example	{
	       key: special
	       hosts: *.example.com
	       default:	<SPECIAL>
	   }

	   access example {
	       key: special
	       users: <SPECIAL>
	       newsgroups: *
	       addcanlockuser: none
	   }

       In this case, the two key parameters bind this auth group with this
       access group.  For any incoming connection matching "*.example.com"
       (assuming there isn't any later auth group that also matches such
       hosts), no access group that doesn't have "key: special"	will even be
       considered.  Similarly, the above access	group will only	be checked if
       the user	was authenticated with an auth group containing	"key:
       special".  This mechanism normally isn't	useful;	there is almost	always
       a better	way to achieve the same	result.

       Also note in the	example	that there's no	default-domain parameter,
       which means that	no domain is appended to the default username and the
       identity	for such connections is	just "<SPECIAL>".  Note	that some
       additional add-ons to INN may prefer that authenticated identities
       always return a full e-mail address (including a	domain), so you	may
       want to set up your system that way if you are using add-ons.  As
       several different persons can be	assigned the same "<SPECIAL>"
       identity, no user-specific Cancel-Lock hashes should be generated.

       Configuration files can be included in other configuration files	via
       the syntax:

	   include <filename>

       The file	named <filename> is then included.  This syntax	is allowed
       only at top-level.

       Below is	the full list of allowable parameters for auth groups and
       access groups, and after	that are some examples that may	make this
       somewhat	clearer.

AUTH GROUP PARAMETERS
       An auth group without at	least one of the res, auth, perl_auth,
       python_auth, or default parameters makes	no sense (and in practice will
       just be ignored).

       auth
	   A   simple	command	  line	 for   a   user	 authenticator	(shell
	   metacharacters are not supported).  If a full path  is  not	given,
	   the	program	 executed  must	 be located in the pathbin/auth/passwd
	   directory.  An authenticator	is a program used to  handle  a	 user-
	   supplied  username  and  password, via a mechanism such as AUTHINFO
	   USER/PASS.  Like with res, one auth group can  have	multiple  auth
	   parameters;	they  will  be	tried  in order	and the	results	of the
	   first successful one	will be	used.  See also	perl_auth.

	   The most common authenticator to use	is ckpasswd(8);	 see  its  man
	   page	for more information.

       default
	   The	default	 username  for	connections  matching this auth	group.
	   This	is the username	assigned to the	user at	connection time	if all
	   resolvers fail or if	there are no res parameters.  Note that	it can
	   be either  a	 bare  username,  in  which  case  default-domain  (if
	   present)  is	 appended  after  an  "@",  or	a full identity	string
	   containing an "@", in which case it will be used verbatim.

       default-domain
	   The default domain string for this auth group.  If a	user  resolver
	   or  authenticator  doesn't  provide	a  domain,  or	if the default
	   username is used and	it doesn't contain an "@", this	domain is used
	   to form the user identity.  (Note that for a	lot  of	 setups,  it's
	   not	really	necessary  for	user identities	to be qualified	with a
	   domain name,	in which case there's no need to use this parameter.)

       hosts
	   A comma-separated list of remote hosts, wildmat  patterns  matching
	   either hostnames or IP addresses, or	IP netblocks specified in CIDR
	   notation.   If  a user connects from	a host that doesn't match this
	   parameter, this auth	group will not match  the  connection  and  is
	   ignored.

	   Note	 that  if  you	have  a	large number of	patterns that can't be
	   merged into broader patterns	(such as a large number	of  individual
	   systems  scattered  around  the  net	 that should have access), the
	   hosts parameter  may	 exceed	 the  maximum  line  length  of	 8,192
	   characters.	 In  that  case,  you'll need to break that auth group
	   into	multiple auth groups, each with	a portion of the hosts	listed
	   in its hosts	parameter, and each assigning the same user identity.

	   All hosts match if this parameter is	not given.

       key If  this  parameter	is  present, any connection matching this auth
	   group will have its privileges determined only  by  the  subset  of
	   access groups containing a matching key parameter.

       localaddress
	   A  comma-separated  list of local host or address patterns with the
	   same	 syntax	 as  the  hosts	 parameter.   If  this	parameter   is
	   specified,  its  auth  group	 will only match connections made to a
	   matching local interface.  (Obviously,  this	 is  only  useful  for
	   servers with	multiple interfaces.)

	   All local addresses match if	this parameter is not given.

       perl_access
	   A path to a Perl script for dynamically generating an access	group.
	   If  an  auth	 group matches successfully and	contains a perl_access
	   parameter, then the argument	Perl script will be used to create  an
	   access  group.  This	group will then	determine the access rights of
	   the client, overriding any access groups in readers.conf.   If  and
	   only	if a successful	auth group contains the	perl_access parameter,
	   readers.conf	 access	groups are ignored and the client's rights are
	   instead determined dynamically.  This parameter is  only  valid  if
	   INN	 is   compiled	 with  Perl  support  (--with-perl  passed  to
	   "configure").   More	 information  may  be  found   in   the	  file
	   doc/hook-perl.

       perl_auth
	   A  path  to	a  Perl	 script	 for  authentication.	The  perl_auth
	   parameter works exactly like	auth, except that it calls  the	 named
	   script  using  the  Perl  hook  rather  than	 an  external program.
	   Multiple/mixed  use	of  the	 auth,	perl_auth,   and   python_auth
	   parameters  is  permitted within any	auth group; each line is tried
	   in the order	it appears.  perl_auth has more	 power	than  auth  in
	   that	  it  provides	the  authentication  program  with  additional
	   information about the client	and the	ability	 to  return  an	 error
	   string  and	a  username.   This  parameter is only valid if	INN is
	   compiled with Perl support  (--with-perl  passed  to	 "configure").
	   More	information may	be found in doc/hook-perl.

       python_access
	   A  Python script for	dynamically generating an access group.	 If an
	   auth	 group	matches	 successfully  and  contains  a	 python_access
	   parameter,  then  the argument script (without its ".py" extension)
	   located in the pathfilter directory	will  be  used	to  create  an
	   access  group.  This	group will then	determine the access rights of
	   the client, overriding any access groups in readers.conf.

	   If and only if a successful auth group contains  the	 python_access
	   parameter,  readers.conf access groups are ignored and the client's
	   rights are instead determined dynamically.

	   This	parameter is only valid	if INN is compiled with	Python support
	   (--with-python passed to "configure").   More  information  may  be
	   found in the	file doc/hook-python.

       python_auth
	   A  Python  script  for  authentication.   The python_auth parameter
	   works exactly like auth, except that	 it  calls  the	 named	script
	   (without  its  ".py"	extension) located in the pathfilter directory
	   using  the  Python  hook   rather   than   an   external   program.
	   Multiple/mixed   use	  of  the  auth,  perl_auth,  and  python_auth
	   parameters is permitted within any auth group; each line  is	 tried
	   in  the  order it appears.  python_auth has more power than auth in
	   that	 it  provides  the  authentication  program  with   additional
	   information	about  the  client  and	the ability to return an error
	   string and a	username.

	   This	parameter is only valid	if INN is compiled with	Python support
	   (--with-python passed to "configure").   More  information  may  be
	   found in doc/hook-python.

       python_dynamic
	   A  Python  script  for applying access control dynamically on a per
	   newsgroup  basis.   If  an  auth  group  matches  successfully  and
	   contains  a	python_dynamic	parameter,  then  the  argument	script
	   (without its	".py" extension) located in the	 pathfilter  directory
	   will	 be  used  to  determine the clients rights each time the user
	   attempts to view a newsgroup, or read or post an  article.	Access
	   rights  as  determined  by  python_dynamic  override	 the values of
	   access group	parameters such	as newsgroups, read and	post.

	   This	parameter is only valid	if INN is compiled with	Python support
	   (--with-python passed to "configure").   More  information  may  be
	   found in the	file doc/hook-python.

       require_encryption
	   If set to true, an incoming connection only matches this auth group
	   if  it  is  encrypted, either from the beginning if the -S flag was
	   passed to nnrpd, or after a successful use of STARTTLS, or after  a
	   successful  authentication using an SASL mechanism which negotiates
	   an encrypted	layer.	 This  parameter  is  only  valid  if  INN  is
	   compiled  with  TLS/SSL  or SASL support (by	default	if the OpenSSL
	   SSL and crypto libraries or the Cyrus SASL  library	are  found  at
	   configure  time,  otherwise	see the	--with-openssl and --with-sasl
	   flags passed	to "configure").

       res A simple command line for a user resolver (shell metacharacters are
	   not supported).  If a full path is not given, the program  executed
	   must	 be  in	 the  pathbin/auth/resolv directory.  A	resolver is an
	   authentication program which	attempts to figure out the identity of
	   the connecting user using nothing but  the  connection  information
	   (in	other  words,  the  user  has  not  provided  a	 username  and
	   password).  An example of  a	 resolver  would  be  a	 program  that
	   assigns  an	identity  from	an  ident  callback or from the	user's
	   hostname.

	   One auth group can have multiple res	parameters, and	they  will  be
	   tried  in  the  order  they're  listed.   The  results of the first
	   successful one will be used.

	   Alternatively, a res	block can be used instead of a res  parameter.
	   The recognized parameters in	such res blocks	are:

	   log
	     A	string	to  log	 in  pathlog/news.notice (with "res also-log:"
	     prepended)	before the resolver is tried.  One res group can  have
	     multiple  log  parameters,	 and  they will	be logged in the order
	     they're listed.

	   program
	     This parameter is mandatory in a res block.  Its meaning  is  the
	     same as the res parameter used directly in	an auth	block.

		 auth <auth-name> {
		     res: <res-program>
		 }

	     is	therefore equivalent to:

		 auth <auth-name> {
		     res <res-name> {
			 program: <res-program>
		     }
		 }

ACCESS GROUP PARAMETERS
       access
	   A  set of letters specifying	the permissions	granted	to the client.
	   The letters are chosen from the following set:

	   A   The client may post articles with Approved  header  fields  (in
	       other  words,  may  approve articles for	moderated newsgroups).
	       By default, this	is not allowed.

	   I   The client may inject articles with IHAVE.  Note	that in	 order
	       to  inject  articles with the IHAVE command, the	user must also
	       have POST permission (the "P" option).  Articles	injected  with
	       IHAVE  are treated as though they were injected with POST, that
	       is to say such articles must not	have been previously  injected
	       (they must not contain header fields like Injection-Info).

	   L   The  client  may	 post  to  newsgroups that are set to disallow
	       local posting (status fields "j", "n" and "x" in	the  active(5)
	       file).

	   N   The  client  may	use the	NEWNEWS	command, overriding the	global
	       setting.

	   P   The client may post articles.

	   R   The client may read articles.

	   Note	that if	this parameter is given, allownewnews in  inn.conf  is
	   ignored  for	connections matching this access group and the ability
	   of the client to use	NEWNEWS	is entirely determined by the presence
	   of "N" in the access	string.	 If you	want to	support	NEWNEWS,  make
	   sure	 to  include  "N"  in  the  access  string  when  you use this
	   parameter.

	   Note	that if	this parameter is given	and "R"	isn't present  in  the
	   access  string,  the	client cannot read regardless of newsgroups or
	   read	parameters.  Similarly,	if this	parameter  is  given  and  "P"
	   isn't  present,  the	 client	 cannot	 post.	 This use of access is
	   deprecated and confusing; it's strongly  recommended	 that  if  the
	   access  parameter  is  used,	 "R" and "P" always be included	in the
	   access string and newsgroups, read, and post	 be  used  to  control
	   access.   (To grant read access but no posting access, one can have
	   just	a read parameter and no	post parameter.)

       addcanlockuser
	   If set to "none", posts made	by these users will not	have  a	 user-
	   specific  hash in the Cancel-Lock header field (only	the admin hash
	   will	be generated).	No Cancel-Key header field will	be present  in
	   cancel  or  supersede  requests.   This  is	a string value and the
	   default is "username", that is to say a user-specific hash based on
	   the identity	assigned to the	connection is used.

	   Another possible value to this parameter is "ip", in	which  case  a
	   user-specific hash based on the IP of the connection	is used	(which
	   should be a static IP so as to actually identify users).

	   See	inn-secrets.conf(5)  for  more	information about Cancel-Lock.
	   The	main  reason  for  this	 parameter  is	to   deactivate	  this
	   authentication  mechanism  when  the	 same  identity	 or  IP	can be
	   assigned by an access group to different people.  Otherwise,	any of
	   these people	would be able to send an authenticated	withdrawal  of
	   an article originally sent by another person	with the same identity
	   or IP.

       domain
	   When	 set,  the value of this parameter is used for the domain part
	   (the	right-hand side	after "@") of  autogenerated  Message-IDs,  as
	   well	 as  for  the  server  name indicated in Injection-Info	header
	   fields.

	   By default, the value of  this  parameter  is  inherited  from  the
	   eponym parameter in inn.conf.  However, if domain is	not explicitly
	   set	in  readers.conf, the specific behaviour described above won't
	   be triggered	unless virtualhost is set to true.

	   You may also	want to	set the	 fromhost  parameter  (inherited  from
	   inn.conf)  for  the	domain part of the newsmaster's	e-mail address
	   and the complaints address in the Injection-Info header  field,  if
	   its	default	 value should be changed, and the complaints parameter
	   is not already set or newsmaster does not already contain an	"@".

       groupexactcount
	   This	parameter controls the threshold below with nnrpd should  give
	   the	exact  number of still existing	articles present in newsgroups
	   instead of an estimate.  The	exact number is	usually	updated	once a
	   day during the expiry process by expirover (run by news.daily), and
	   is updated when  new	 articles  arrive  but	not  necessarily  when
	   articles  are  cancelled  or	 overwritten  in self-expiring storage
	   methods like	CNFS.

	   When	the estimated count  of	 articles  is  strictly	 smaller  than
	   groupexactcount,  nnrpd  will  recount the number of	still existing
	   articles, and report	the exact value.  If groupexactcount is	set to
	   0, nnrpd will always	recount.  If set to 1, it will never recount.

	   Though exact	article	counts are not required, they may be useful to
	   distinguish empty newsgroups	by  reporting  an  exact  count	 of  0
	   instead  of	an estimate of 1 (when it happens, the news client may
	   show	that 1 article is present in the newsgroup, then it  tries  to
	   retrieve  the  article,  and	 finally does not show anything	to the
	   user).

	   It is not recommended to set	a high value to	this parameter because
	   it will slow	the responses to  news	clients	 (recounting  existing
	   articles  takes  time,  especially  on  newsgroups  with  a	lot of
	   articles).

	   This	is an integer value, and the default is	5.

       key If this parameter is	present, this access group is only  considered
	   when	 finding  privileges  for users	matching auth groups with this
	   same	key parameter.

       localtime
	   If a	Date or	an Injection-Date header field is not  included	 in  a
	   posted article, nnrpd normally adds these header fields in UTC.  If
	   this	 is  set  to  true, the	Date header field will be formatted in
	   local time instead.	(The  Injection-Date  header  field  is	 added
	   according  to  the  behaviour  of the addinjectiondate parameter in
	   inn.conf, and will remain in	UTC, though.)  This is a boolean value
	   and the default is false.

	   This	parameter permits handling a relatively	unusual	 corner	 case.
	   It  is  mostly  a  tool for people who want to disclose their local
	   time	zone (it  can  be  useful  information	in  certain  types  of
	   discussions),  but whose clients don't for some reason, and who can
	   arrange for the server to be	in the same time zone as the client.

       max_rate
	   If this parameter is	present	(and non-zero),	it is used for nnrpd's
	   rate-limiting code.	The client will	only be	able  to  download  at
	   this	 speed (in bytes/second).  Note	that if	an encryption layer is
	   being used, limiting	is applied to the pre-encryption datastream.

       newsgroups
	   Users that match this access	group are allowed to read and post  to
	   all	newsgroups  matching  this  comma-separated  list  of  wildmat
	   patterns.  The empty	string is equivalent to	 "newsgroups:  *";  if
	   this	 parameter is missing, the connection will be rejected (unless
	   read	and/or post are	used instead).

       newsmaster
	   Used	as the contact address in the help message returned by	nnrpd.
	   If  unset, the address will consist of the newsmaster name selected
	   at configure	time ("usenet" by default), an "@", and	the  value  of
	   fromhost as set in inn.conf or overridden in	readers.conf.

	   If  this  parameter	is  set	 and does not contain "@", the contact
	   address will	consist	of the given value followed by an "@" and  the
	   value of fromhost.

       perlfilter
	   If  set to false, posts made	by these users do not pass through the
	   Perl	filter even if it is otherwise enabled.	  This	is  a  boolean
	   value and the default is true.

       post
	   Like	 the  newsgroups  parameter,  but  the	client	is  only given
	   permission to post to the matching newsgroups.  This	 parameter  is
	   often used with read	to define the patterns for reading and posting
	   separately  (usually	 to  give  the	user  permission  to read more
	   newsgroups than they're permitted to	post to).  It cannot  be  used
	   in the same access group with a newsgroups parameter.

       pythonfilter
	   If  set to false, posts made	by these users do not pass through the
	   Python filter even if it is otherwise enabled.  This	is  a  boolean
	   value and the default is true.

	   This	 parameter  currently has no effect as Python filtering	is not
	   implemented yet in nnrpd.  If you want to do	Python filtering,  you
	   have	to use the one implemented in innd.

       read
	   Like	 the  newsgroups  parameter,  but  the	client	is  only given
	   permission to read the  matching  newsgroups.   This	 parameter  is
	   often used with post	to specify some	read-only groups; it cannot be
	   used	 in  the  same	access group with a newsgroups parameter.  (If
	   read	is used	and post is missing, the client	will have  only	 read-
	   only	access.)

       reject_with
	   If  this parameter is present, a client matching this block will be
	   disconnected	with a	"Permission  denied"  message  containing  the
	   contents  (a	 "reason" string) of this parameter.  Some newsreaders
	   will	then display the reason	to the user.

       strippath
	   If set to true, any Path header field provided by a user in a  post
	   is  stripped	 rather	 than used as the beginning of the Path	header
	   field body of the article.  This is a boolean value and the default
	   is false.

       users
	   The privileges given	 by  this  access  group  apply	 to  any  user
	   identity   which  matches  this  comma-separated  list  of  wildmat
	   patterns.  If this parameter	isn't given, the access	group  applies
	   to all users	(and is	essentially equivalent to "users: *").

       virtualhost
	   Set	this  parameter	to true	in order to make nnrpd behave as if it
	   is running on a server with a different name	than it	actually  has.
	   The domain parameter	must then be set, either in inn.conf or	in the
	   same	 access	 group.	  All  articles	and overview data displayed to
	   clients will	have their Xref	header field bodies altered to	appear
	   to be from the server named in domain, and posted articles will use
	   that	 server	name in	the Message-ID and Injection-Info header field
	   bodies.  (Moreover, if the -I flag  was  given  to  nnrpd,  posting
	   agents  will	 be  proposed to use Message-IDs containing the	string
	   specified with -I.)

	   Similarly, the Path header field bodies  displayed  to  clients  or
	   generated  in  posted  articles  will  use  the value of domain (if
	   pathhost is not set in the access group, or has the same  value  as
	   in inn.conf)	or pathhost (if	pathhost is set	in the access group to
	   something different than is set in inn.conf).

	   At  least  one  of the domain or pathhost parameters	must be	set in
	   the access group to something different than	in inn.conf, otherwise
	   nnrpd will fail to start.

	   You may also	want to	set  the  complaints,  domain,	fromhost,  and
	   newsmaster parameters to specific values if you use this parameter.

	   Note	 that  setting	this  parameter	requires the server modify all
	   posts before	presenting  them  to  the  client  and	therefore  may
	   decrease performance	slightly.

       In addition, all	of the following parameters are	valid in access	groups
       and  override  the global setting in inn.conf.  See inn.conf(5) for the
       descriptions of these parameters:

	   addinjectiondate, addinjectionpostingaccount,
	   addinjectionpostinghost, backoff_auth, backoff_db, backoff_k,
	   backoff_postfast, backoff_postslow, backoff_trigger,
	   checkincludedtext, clienttimeout, complaints, fromhost,
	   localmaxartsize, moderatormailer, nnrpdauthsender, nnrpdcheckart,
	   nnrpdoverstats, nnrpdposthost, nnrpdpostport, organization,
	   pathhost, readertrack, spoolfirst, strippostcc.

SUMMARY
       Here's a	basic summary of what happens when a client connects:

          All auth groups are scanned and  the	 ones  that  don't  match  the
	   client  (due	 to hosts, localaddress, require_encryption, etc.) are
	   eliminated.

          The remaining auth groups are scanned from the last to  the	first,
	   and an attempt is made to apply it to the current connection.  This
	   means running res programs, if any, and otherwise applying default.
	   The	first  auth group (starting from the bottom) to	return a valid
	   user	is kept	as the active auth group.

          If no auth groups yield a valid user	(none have default  parameters
	   or  successful  res programs) but some of the auth groups have auth
	   lines (indicating a possibility that	the user can authenticate  and
	   then	 obtain	 permissions), the connection is considered to have no
	   valid auth group (which means that the access  groups  are  ignored
	   completely)	but  the  connection  isn't  closed.   Instead,	 a 480
	   response code (meaning that authentication is required) is returned
	   for everything until	the user authenticates.

          When	the user authenticates,	the auth  groups  are  rescanned,  and
	   only	 the matching ones which contain at least one auth, perl_auth,
	   or python_auth line are considered.	These auth groups are  scanned
	   from	 the last to the first,	running	auth programs and perl_auth or
	   python_auth scripts.	 The  first  auth  group  (starting  from  the
	   bottom) to return a valid user is kept as the active	auth group.

          Regardless  of how an auth group is established, as soon as one is,
	   that	auth group is used to assign a user  identity  by  taking  the
	   result  of the successful res, auth,	perl_auth, or python_auth line
	   (or the default if  necessary),  and	 appending  default-domain  if
	   necessary.	(If  the  perl_access  or  python_access  parameter is
	   present.)

          Finally, an access group is selected	by scanning the	access	groups
	   from	 bottom	 up  and finding the first match.  (If the established
	   auth	group contained	 a  perl_access	 or  python_access  line,  the
	   dynamically	generated  access group	returned by the	script is used
	   instead.)  User permissions are granted based  on  the  established
	   access group.

EXAMPLES
       Probably	 the  simplest useful example of a complete readers.conf, this
       gives permissions to read and post to all  groups  to  any  connections
       from  the  "example.com"	 domain,  except  for  Bob's  machine,	and no
       privileges for anyone connecting	elsewhere:

	   auth	example.com {
	       hosts: "*.example.com, example.com, !bob.example.com"
	       default:	"<EXAMPLE>"
	   }

	   access full {
	       users: "<EXAMPLE>"
	       newsgroups: *
	       addcanlockuser: none
	   }

       Note that the above access realm	could  also  be	 written  without  the
       users  key,  in	which  case it applies to any user identity (though in
       this example, the user identity that will be assigned to	 all  matching
       connections  is	"<EXAMPLE>").	It  is	however	recommended to keep an
       explicit	users key so as	to  better  view  to  whom  the	 access	 block
       applies.

       As   the	  only	 available  auth  realm	 only  matches	hosts  in  the
       "example.com" domain, any connections from other	hosts will be rejected
       immediately.

       If you have some	systems	that should only have read-only	access to  the
       server,	you  can  modify  the  example	above  slightly	 by  adding an
       additional auth and access group:

	   auth	lab {
	       hosts: "*.lab.example.com"
	       default:	<LAB>
	   }

	   access lab {
	       users: <LAB>
	       read: *
	   }

       If those	are put	in the file after  the	above  example,	 they'll  take
       precedence (because they're later in the	file) for any user coming from
       a  machine  in the lab.example.com domain, everyone will	only have read
       access, not posting access.

       Here's a	similar	example	for a news  server  that  accepts  connections
       from anywhere but requires the user to specify a	username and password.
       The  username  and  password  are  first	 checked  against  an external
       database	of usernames and passwords, and	then make use of PAM:

	   auth	all {
	       auth: "ckpasswd -f <pathdb in inn.conf>/newsusers"
	       auth: ckpasswd
	   }

	   access full {
	       users: *
	       newsgroups: *
	   }

       When the	user first connects, there are no res keys and no default,  so
       they  don't  receive  any valid identity	and the	connection won't match
       any access groups (even ones with  "users:  *").	  Such	users  receive
       nothing	but  authentication-required  responses	 from nnrpd until they
       authenticate.

       If they then later authenticate,	the username and password are  checked
       first  by  running  ckpasswd with the -f	option for an external file of
       encrypted passwords, and	then uses PAM  (if  INN	 was  built  with  PAM
       support)	 to  check  the	password (and if that fails, it	tries to check
       the password against the	password field returned	by  getpwnam(3)).   If
       both  of	 those	fail,  the  user  will	continue  to have no identity;
       otherwise, an identity will be assigned (usually	the supplied username,
       perhaps with a domain appended, although	an  authenticator  technically
       can  provide a completely different username for	the identity), and the
       access group will match,	giving full access.

       It may be educational to	consider how to	combine	 the  above  examples;
       general	groups always go first.	 The order of the auth groups actually
       doesn't	matter,	 since	the  "hosts:  example.com"  one	 only  matches
       connections  before username/password is	sent, and the "auth: ckpasswd"
       one only	matches	after; order would matter if either group  applied  to
       both  cases.   The order	of the access groups in	this case does matter,
       provided	the newsgroups lines differ; the access	group  with  no	 users
       line needs to be	first, with the	"users:	<LOCAL>" group after.

       Here's  an  example  of	another	common case: a server that only	allows
       connections from	a local	domain and has an additional hierarchy	that's
       password-restricted.

	   auth	"example.com" {
	       hosts: "*.example.com"
	       auth: "ckpasswd -f <pathdb in inn.conf>/newsusers"
	       default:	"anonymous"
	   }

	   access regular {
	       newsgroups: "*,!example.restricted.*"
	       addcanlockuser: none
	   }

	   access full {
	       users: "*,!anonymous"
	       newsgroups: *
	   }

       In  this	 example,  unauthenticated users get the identity "anonymous",
       which matches only the first access group and hence doesn't get	access
       to  the "example.restricted.*" hierarchy.  No user-specific Cancel-Lock
       elements	 should	 be  generated	for  anonymous	users.	  Anyone   who
       authenticates  using  a password	in the newsusers file gets full	access
       to all groups.  However,	note that the  only  authentication  block  is
       limited	to hostnames in	the example.com	domain;	connections outside of
       that domain will	never be allowed access	nor  have  an  opportunity  to
       authenticate.

       Here's  a  very	complicated example.  This is for an organization that
       has an internal hierarchy "example.*" only  available  to  local	 shell
       users,  who  are	 on  machines  where identd(8) can be trusted.	Dialup
       users must provide a username  and  password,  which  is	 then  checked
       against	RADIUS.	  Remote  users	 have  to  use a username and password
       that's checked against a	database on the	 news  server.	 Finally,  the
       admin  staff  (users "joe" and "jane") can post anywhere	(including the
       "example.admin.*" groups	that are read-only for everyone	else), and are
       exempted	from the Perl filter.  For an  additional  twist,  posts  from
       dialup	users  have  their  Sender  header  field  replaced  by	 their
       authenticated identity.

       Since this organization has some	 internal  moderated  newsgroups,  the
       admin  staff  can  also	post messages with Approved header fields, but
       other users cannot.

	   auth	default	{
	       auth: "ckpasswd -f <pathdb in inn.conf>/newsusers"
	       default:	<FAIL>
	       default-domain: example.com
	   }

	   auth	shell {
	       hosts: *.shell.example.com
	       res: ident
	       auth: ckpasswd
	       default:	<FAIL>
	       default-domain: shell.example.com
	   }

	   auth	dialup {
	       hosts: *.dialup.example.com
	       auth: radius
	       default:	<FAIL>
	       default-domain: dialup.example.com
	   }

	   access shell	{
	       users: *@shell.example.com
	       read: *
	       post: "*, !example.admin.*"
	   }

	   access dialup {
	       users: *@dialup.example.com
	       newsgroups: *,!example.*
	       nnrpdauthsender:	true
	   }

	   access other	{
	       users: "*@example.com, !<FAIL>@example.com"
	       newsgroups: *,!example.*
	   }

	   access fail {
	       users: "<FAIL>@*"
	       newsgroups: !*
	   }

	   access admin	{
	       users: "joe@*,jane@*"
	       newsgroups: *
	       access: "RPA"
	       perlfilter: false
	   }

       Note the	use of different domains to separate dialup from  shell	 users
       easily.	 Another way to	do that	would be with key parameters, but this
       way provides slightly more intuitive identity strings.  Note also  that
       the  fail  access  group	 catches  not  only  failing  connections from
       external	users but also failed authentication of	shell and dialup users
       before they've authenticated.  The  identity  string  given  for,  say,
       dialup  users  before  RADIUS authentication has	been attempted matches
       both the	dialup access group and	the  fail  access  group,  since  it's
       "<FAIL>@dialup.example.com",  but  the  fail group is last, so it takes
       precedence.

       The shell auth group has	an auth	parameter  so  that  users  "joe"  and
       "jane" can, if they choose, use username	and password authentication to
       gain  their special privileges even if they're logged on	as a different
       user on the shell machines (or if  ident	 isn't	working).   When  they
       first  connect,	they'd have the	default	access for that	user, but they
       could then authenticate in order	to get their extended access.

       Also note that if the users  "joe"  and	"jane"	are  using  their  own
       accounts,  they	get  their  special  privileges	regardless of how they
       connect,	whether	the dialups, the shell machines,  or  even  externally
       with a username and password.

       Finally,	 here's	 a very	simple example of a configuration for a	public
       server for a particular hierarchy.

	   auth	default	{
	       hosts: *
	       default:	<PUBLIC>
	   }

	   access default {
	       users: <PUBLIC>
	       newsgroups: example.*
	       addcanlockuser: none
	   }

       Notice that clients aren't allowed to read any other groups; this keeps
       them from getting access	to administrative groups  or  reading  control
       messages,  just	as  a  precaution.   When running a public server like
       this, be	aware that many	public hierarchies will	later be  pulled  down
       and  reinjected	into  the main Usenet, so it's highly recommended that
       you also	run a Perl or Python filter to reject any messages crossposted
       out of your local hierarchy, and	any messages containing	 a  Supersedes
       header  field.  This will keep messages posted to your public hierarchy
       from hurting any	of the rest of Usenet if they leak out.

       For more	complex	cases, or if you just prefer  to  use  a  database  to
       store authentication and/or authorization information, you can use Perl
       or Python scripts to dynamically	authenticate the users and/or generate
       their  access  blocks.	You  may  then put all the related information
       (user, password,	newsgroups for reading,	newsgroups for posting,	 etc.)
       for  instance  in  an  SQLite  database,	 and  use  an nnrpd_auth.pl or
       nnrpd_auth.py   script	to   authenticate   the	  users,   and/or   an
       nnrpd_access.pl	or  nnrpd_access.py  script to grant the access.  Then
       readers.conf only needs defining:

	   auth	checkcredentials {
	       perl_auth: "/path/to/script/nnrpd_auth.pl"
	       perl_access: "/path/to/script/nnrpd_access.pl"
	   }

       or:

	   auth	checkcredentials {
	       python_auth: "nnrpd_auth"
	       python_access: "nnrpd_access"
	   }

       The advantage of	these external scripts is that you can	code  whatever
       rules  you  want, possibly based	on a database shared between your news
       service and other services you may provide to your users.  You can more
       easily handle hundreds or thousands of users with external scripts than
       with the	mere use of readers.conf stock blocks and a flat file for  the
       credentials of each listed user.

SECURITY CONSIDERATIONS
       In  general,  separate  passwords  should  be  used  for	 NNTP wherever
       possible; the NNTP protocol itself  does	 not  protect  passwords  from
       casual  interception,  and many implementations (including this one) do
       not "lock  out"	accounts  or  otherwise	 discourage  password-guessing
       attacks.	  So  it  is  best  to	ensure that a compromised password has
       minimal effects.

       Authentication using the	AUTHINFO USER/PASS commands passes unencrypted
       over the	network.  Extreme caution should therefore be used  especially
       with  system  passwords	(e.g.  "auth: ckpasswd -s").  Passwords	can be
       protected by using NNTP over TLS/SSL or through ssh tunnels,  and  this
       usage  can  be  enforced	by a well-considered server configuration that
       only permits certain auth groups	to be applied in certain  cases.   One
       can  also  authenticate	using  a strong	SASL mechanism.	 Here are some
       ideas:

          To restrict connections on the standard NNTP	port (119) to  use  an
	   encryption layer for	some (or all) of the auth groups to match, use
	   the	require_encryption  parameter.	 Note  that  a	client can use
	   STARTTLS to negotiate an encrypted TLS connection.  A secure	 layer
	   can also be negotiated during authentication	via AUTHINFO SASL.

          If  you  consider your local	network	(but not the internet) secure,
	   have	some auth groups with  a  restrictive  hosts  parameter;  they
	   would go above, with	ones having global applicability below.

          Consider  running  nnrpd  with the -S flag (either also with	-D, or
	   out of "super-server" like inetd)  on  the  NNTPS  port  (563)  for
	   clients  that support TLS/SSL.  See nnrpd(8)	for more details about
	   how	to  configure  that.   You  can	 use  the   require_encryption
	   parameter  or the -c	flag to	specify	an alternate readers.conf file
	   if you want a substantially different configuration for this	case.

          If you want to restrict  an	auth  group  to	 only  match  loopback
	   connections	 (for	users  running	newsreaders  on	 localhost  or
	   connecting via an ssh tunnel), use the localaddress parameter.

HISTORY
       Written	 by   Aidan   Cully   <aidan@panix.com>	  for	 InterNetNews.
       Substantially expanded by Russ Allbery <eagle@eyrie.org>.

SEE ALSO
       auth_krb5(8),  ckpasswd(8),  inn.conf(5), innd(8), inn-secrets.conf(5),
       libinn_uwildmat(3), newsfeeds(5), nnrpd(8).

INN 2.8.0			  2024-12-23		       READERS.CONF(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=readers.conf&sektion=5&manpath=FreeBSD+Ports+14.3.quarterly>

home | help