brintos

brintos / linux-shallow public Read only

0
0
Text · 5.0 KiB · c0364f7 Raw
156 lines · plain
1.. SPDX-License-Identifier: GPL-2.02 3===================4DNS Resolver Module5===================6 7.. Contents:8 9 - Overview.10 - Compilation.11 - Setting up.12 - Usage.13 - Mechanism.14 - Debugging.15 16 17Overview18========19 20The DNS resolver module provides a way for kernel services to make DNS queries21by way of requesting a key of key type dns_resolver.  These queries are22upcalled to userspace through /sbin/request-key.23 24These routines must be supported by userspace tools dns.upcall, cifs.upcall and25request-key.  It is under development and does not yet provide the full feature26set.  The features it does support include:27 28 (*) Implements the dns_resolver key_type to contact userspace.29 30It does not yet support the following AFS features:31 32 (*) Dns query support for AFSDB resource record.33 34This code is extracted from the CIFS filesystem.35 36 37Compilation38===========39 40The module should be enabled by turning on the kernel configuration options::41 42	CONFIG_DNS_RESOLVER	- tristate "DNS Resolver support"43 44 45Setting up46==========47 48To set up this facility, the /etc/request-key.conf file must be altered so that49/sbin/request-key can appropriately direct the upcalls.  For example, to handle50basic dname to IPv4/IPv6 address resolution, the following line should be51added::52 53 54	#OP	TYPE		DESC	CO-INFO	PROGRAM ARG1 ARG2 ARG3 ...55	#======	============	=======	=======	==========================56	create	dns_resolver  	*	*	/usr/sbin/cifs.upcall %k57 58To direct a query for query type 'foo', a line of the following should be added59before the more general line given above as the first match is the one taken::60 61	create	dns_resolver  	foo:*	*	/usr/sbin/dns.foo %k62 63 64Usage65=====66 67To make use of this facility, one of the following functions that are68implemented in the module can be called after doing::69 70	#include <linux/dns_resolver.h>71 72     ::73 74	int dns_query(const char *type, const char *name, size_t namelen,75		     const char *options, char **_result, time_t *_expiry);76 77     This is the basic access function.  It looks for a cached DNS query and if78     it doesn't find it, it upcalls to userspace to make a new DNS query, which79     may then be cached.  The key description is constructed as a string of the80     form::81 82		[<type>:]<name>83 84     where <type> optionally specifies the particular upcall program to invoke,85     and thus the type of query to do, and <name> specifies the string to be86     looked up.  The default query type is a straight hostname to IP address87     set lookup.88 89     The name parameter is not required to be a NUL-terminated string, and its90     length should be given by the namelen argument.91 92     The options parameter may be NULL or it may be a set of options93     appropriate to the query type.94 95     The return value is a string appropriate to the query type.  For instance,96     for the default query type it is just a list of comma-separated IPv4 and97     IPv6 addresses.  The caller must free the result.98 99     The length of the result string is returned on success, and a negative100     error code is returned otherwise.  -EKEYREJECTED will be returned if the101     DNS lookup failed.102 103     If _expiry is non-NULL, the expiry time (TTL) of the result will be104     returned also.105 106The kernel maintains an internal keyring in which it caches looked up keys.107This can be cleared by any process that has the CAP_SYS_ADMIN capability by108the use of KEYCTL_KEYRING_CLEAR on the keyring ID.109 110 111Reading DNS Keys from Userspace112===============================113 114Keys of dns_resolver type can be read from userspace using keyctl_read() or115"keyctl read/print/pipe".116 117 118Mechanism119=========120 121The dns_resolver module registers a key type called "dns_resolver".  Keys of122this type are used to transport and cache DNS lookup results from userspace.123 124When dns_query() is invoked, it calls request_key() to search the local125keyrings for a cached DNS result.  If that fails to find one, it upcalls to126userspace to get a new result.127 128Upcalls to userspace are made through the request_key() upcall vector, and are129directed by means of configuration lines in /etc/request-key.conf that tell130/sbin/request-key what program to run to instantiate the key.131 132The upcall handler program is responsible for querying the DNS, processing the133result into a form suitable for passing to the keyctl_instantiate_key()134routine.  This then passes the data to dns_resolver_instantiate() which strips135off and processes any options included in the data, and then attaches the136remainder of the string to the key as its payload.137 138The upcall handler program should set the expiry time on the key to that of the139lowest TTL of all the records it has extracted a result from.  This means that140the key will be discarded and recreated when the data it holds has expired.141 142dns_query() returns a copy of the value attached to the key, or an error if143that is indicated instead.144 145See <file:Documentation/security/keys/request-key.rst> for further146information about request-key function.147 148 149Debugging150=========151 152Debugging messages can be turned on dynamically by writing a 1 into the153following file::154 155	/sys/module/dns_resolver/parameters/debug156