DNS Resolver Module

Overview

The DNS resolver module provides a way for kernel services to make DNS queriesby way of requesting a key of key type dns_resolver. These queries areupcalled to userspace through /sbin/request-key.

These routines must be supported by userspace tools dns.upcall, cifs.upcall andrequest-key. It is under development and does not yet provide the full featureset. 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 handlebasic dname to IPv4/IPv6 address resolution, the following line should beadded:

#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 addedbefore 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 areimplemented in the module can be called after doing:

   #include <linux/dns_resolver.h>::   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 ifit doesn't find it, it upcalls to userspace to make a new DNS query, whichmay then be cached.  The key description is constructed as a string of theform::           [<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 belooked up.  The default query type is a straight hostname to IP addressset lookup.The name parameter is not required to be a NUL-terminated string, and itslength should be given by the namelen argument.The options parameter may be NULL or it may be a set of optionsappropriate 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 andIPv6 addresses.  The caller must free the result.The length of the result string is returned on success, and a negativeerror code is returned otherwise.  -EKEYREJECTED will be returned if theDNS lookup failed.If _expiry is non-NULL, the expiry time (TTL) of the result will bereturned 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 bythe 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 ofthis type are used to transport and cache DNS lookup results from userspace.

When dns_query() is invoked, it calls request_key() to search the localkeyrings for a cached DNS result. If that fails to find one, it upcalls touserspace to get a new result.

Upcalls to userspace are made through the request_key() upcall vector, and aredirected 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 theresult into a form suitable for passing to the keyctl_instantiate_key()routine. This then passes the data to dns_resolver_instantiate() which stripsoff and processes any options included in the data, and then attaches theremainder of the string to the key as its payload.

The upcall handler program should set the expiry time on the key to that of thelowest TTL of all the records it has extracted a result from. This means thatthe 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 ifthat is indicated instead.

See <file:Documentation/security/keys/request-key.rst> for furtherinformation about request-key function.

Debugging

Debugging messages can be turned on dynamically by writing a 1 into thefollowing file:

/sys/module/dnsresolver/parameters/debug