123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- ===================
- DNS Resolver Module
- ===================
- Contents:
- - Overview.
- - Compilation.
- - Setting up.
- - Usage.
- - Mechanism.
- - Debugging.
- ========
- OVERVIEW
- ========
- The DNS resolver module provides a way for kernel services to make DNS queries
- by way of requesting a key of key type dns_resolver. These queries are
- upcalled to userspace through /sbin/request-key.
- These routines must be supported by userspace tools dns.upcall, cifs.upcall and
- request-key. It is under development and does not yet provide the full feature
- set. The features it does support include:
- (*) Implements the dns_resolver key_type to contact userspace.
- It does not yet support the following AFS features:
- (*) Dns query support for AFSDB resource record.
- This code is extracted from the CIFS filesystem.
- ===========
- COMPILATION
- ===========
- The module should be enabled by turning on the kernel configuration options:
- CONFIG_DNS_RESOLVER - tristate "DNS Resolver support"
- ==========
- SETTING UP
- ==========
- To set up this facility, the /etc/request-key.conf file must be altered so that
- /sbin/request-key can appropriately direct the upcalls. For example, to handle
- basic dname to IPv4/IPv6 address resolution, the following line should be
- added:
- #OP TYPE DESC CO-INFO PROGRAM ARG1 ARG2 ARG3 ...
- #====== ============ ======= ======= ==========================
- create dns_resolver * * /usr/sbin/cifs.upcall %k
- To direct a query for query type 'foo', a line of the following should be added
- before the more general line given above as the first match is the one taken.
- create dns_resolver foo:* * /usr/sbin/dns.foo %k
- =====
- USAGE
- =====
- To make use of this facility, one of the following functions that are
- implemented in the module can be called after doing:
- #include <linux/dns_resolver.h>
- (1) int dns_query(const char *type, const char *name, size_t namelen,
- const char *options, char **_result, time_t *_expiry);
- This is the basic access function. It looks for a cached DNS query and if
- it doesn't find it, it upcalls to userspace to make a new DNS query, which
- may then be cached. The key description is constructed as a string of the
- form:
- [<type>:]<name>
- where <type> optionally specifies the particular upcall program to invoke,
- and thus the type of query to do, and <name> specifies the string to be
- looked up. The default query type is a straight hostname to IP address
- set lookup.
- The name parameter is not required to be a NUL-terminated string, and its
- length should be given by the namelen argument.
- The options parameter may be NULL or it may be a set of options
- appropriate to the query type.
- The return value is a string appropriate to the query type. For instance,
- for the default query type it is just a list of comma-separated IPv4 and
- IPv6 addresses. The caller must free the result.
- The length of the result string is returned on success, and a negative
- error code is returned otherwise. -EKEYREJECTED will be returned if the
- DNS lookup failed.
- If _expiry is non-NULL, the expiry time (TTL) of the result will be
- returned also.
- The kernel maintains an internal keyring in which it caches looked up keys.
- This can be cleared by any process that has the CAP_SYS_ADMIN capability by
- the use of KEYCTL_KEYRING_CLEAR on the keyring ID.
- ===============================
- READING DNS KEYS FROM USERSPACE
- ===============================
- Keys of dns_resolver type can be read from userspace using keyctl_read() or
- "keyctl read/print/pipe".
- =========
- MECHANISM
- =========
- The dnsresolver module registers a key type called "dns_resolver". Keys of
- this type are used to transport and cache DNS lookup results from userspace.
- When dns_query() is invoked, it calls request_key() to search the local
- keyrings for a cached DNS result. If that fails to find one, it upcalls to
- userspace to get a new result.
- Upcalls to userspace are made through the request_key() upcall vector, and are
- directed by means of configuration lines in /etc/request-key.conf that tell
- /sbin/request-key what program to run to instantiate the key.
- The upcall handler program is responsible for querying the DNS, processing the
- result into a form suitable for passing to the keyctl_instantiate_key()
- routine. This then passes the data to dns_resolver_instantiate() which strips
- off and processes any options included in the data, and then attaches the
- remainder of the string to the key as its payload.
- The upcall handler program should set the expiry time on the key to that of the
- lowest TTL of all the records it has extracted a result from. This means that
- the key will be discarded and recreated when the data it holds has expired.
- dns_query() returns a copy of the value attached to the key, or an error if
- that is indicated instead.
- See <file:Documentation/security/keys-request-key.txt> for further
- information about request-key function.
- =========
- DEBUGGING
- =========
- Debugging messages can be turned on dynamically by writing a 1 into the
- following file:
- /sys/module/dnsresolver/parameters/debug
|