xref: /freebsd/lib/libcasper/services/cap_dns/cap_dns.3 (revision 133b8ab5bbd9bada9b034f2eafa2bc0550207fd4)
1d06b4cefSMariusz Zaborski.\" Copyright (c) 2018 Mariusz Zaborski <oshogbo@FreeBSD.org>
2d06b4cefSMariusz Zaborski.\" All rights reserved.
3d06b4cefSMariusz Zaborski.\"
4d06b4cefSMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without
5d06b4cefSMariusz Zaborski.\" modification, are permitted provided that the following conditions
6d06b4cefSMariusz Zaborski.\" are met:
7d06b4cefSMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright
8d06b4cefSMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer.
9d06b4cefSMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright
10d06b4cefSMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer in the
11d06b4cefSMariusz Zaborski.\"    documentation and/or other materials provided with the distribution.
12d06b4cefSMariusz Zaborski.\"
13d06b4cefSMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
14d06b4cefSMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15d06b4cefSMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16d06b4cefSMariusz Zaborski.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
17d06b4cefSMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18d06b4cefSMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19d06b4cefSMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20d06b4cefSMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21d06b4cefSMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22d06b4cefSMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23d06b4cefSMariusz Zaborski.\" SUCH DAMAGE.
24d06b4cefSMariusz Zaborski.\"
25d06b4cefSMariusz Zaborski.\" $FreeBSD$
26d06b4cefSMariusz Zaborski.\"
27*133b8ab5SAlan Somers.Dd April 18, 2020
28d06b4cefSMariusz Zaborski.Dt CAP_DNS 3
29d06b4cefSMariusz Zaborski.Os
30d06b4cefSMariusz Zaborski.Sh NAME
31fe249490SMariusz Zaborski.Nm cap_getaddrinfo ,
32fe249490SMariusz Zaborski.Nm cap_getnameinfo ,
33d06b4cefSMariusz Zaborski.Nm cap_gethostbyname ,
34d06b4cefSMariusz Zaborski.Nm cap_gethostbyname2 ,
35d06b4cefSMariusz Zaborski.Nm cap_gethostbyaddr ,
36d06b4cefSMariusz Zaborski.Nm cap_dns_type_limit ,
37d06b4cefSMariusz Zaborski.Nm cap_dns_family_limit
38d06b4cefSMariusz Zaborski.Nd "library for getting network host entry in capability mode"
39d06b4cefSMariusz Zaborski.Sh LIBRARY
40d06b4cefSMariusz Zaborski.Lb libcap_dns
41d06b4cefSMariusz Zaborski.Sh SYNOPSIS
42d06b4cefSMariusz Zaborski.In sys/nv.h
43d06b4cefSMariusz Zaborski.In libcasper.h
44d06b4cefSMariusz Zaborski.In casper/cap_dns.h
45fe249490SMariusz Zaborski.Ft int
46fe249490SMariusz Zaborski.Fn cap_getaddrinfo "cap_channel_t *chan" "const char *hostname" "const char *servname" "const struct addrinfo *hints" "struct addrinfo **res"
47fe249490SMariusz Zaborski.Ft int
48fe249490SMariusz Zaborski.Fn cap_getnameinfo "cap_channel_t *chan" "const struct sockaddr *sa" "socklen_t salen" "char *host" "size_t hostlen" "char *serv" "size_t servlen" "int flags"
49d06b4cefSMariusz Zaborski.Ft "struct hostent *"
50d06b4cefSMariusz Zaborski.Fn cap_gethostbyname "const cap_channel_t *chan" "const char *name"
51d06b4cefSMariusz Zaborski.Ft "struct hostent *"
52d06b4cefSMariusz Zaborski.Fn cap_gethostbyname2 "const cap_channel_t *chan" "const char *name" "int af"
53d06b4cefSMariusz Zaborski.Ft "struct hostent *"
54d06b4cefSMariusz Zaborski.Fn cap_gethostbyaddr "const cap_channel_t *chan" "const void *addr" "socklen_t len" "int af"
55d06b4cefSMariusz Zaborski.Ft "int"
56d06b4cefSMariusz Zaborski.Fn cap_dns_type_limit "cap_channel_t *chan" "const char * const *types" "size_t ntypes"
57d06b4cefSMariusz Zaborski.Ft "int"
58d06b4cefSMariusz Zaborski.Fn cap_dns_family_limit "const cap_channel_t *chan" "const int *families" "size_t nfamilies"
59d06b4cefSMariusz Zaborski.Sh DESCRIPTION
60fe249490SMariusz Zaborski.Bf -symbolic
61fe249490SMariusz ZaborskiThe
62fe249490SMariusz Zaborski.Fn cap_getaddrinfo ,
63fe249490SMariusz Zaborskiand
64fe249490SMariusz Zaborski.Fn cap_getnameinfo ,
65fe249490SMariusz Zaborskifunctions are preferred over the
66fe249490SMariusz Zaborski.Fn cap_gethostbyname ,
67fe249490SMariusz Zaborski.Fn cap_gethostbyname2 ,
68fe249490SMariusz Zaborskiand
69fe249490SMariusz Zaborski.Fn cap_gethostbyaddr
70fe249490SMariusz Zaborskifunctions.
71fe249490SMariusz Zaborski.Ef
72fe249490SMariusz Zaborski.Pp
73d06b4cefSMariusz ZaborskiThe functions
74d06b4cefSMariusz Zaborski.Fn cap_gethostbyname ,
75d06b4cefSMariusz Zaborski.Fn cap_gethostbyname2 ,
76d06b4cefSMariusz Zaborski.Fn cep_gethostbyaddr
77d06b4cefSMariusz Zaborskiand
78280f3264SMariusz Zaborski.Fn cap_getnameinfo
79d06b4cefSMariusz Zaborskiare respectively equivalent to
80*133b8ab5SAlan Somers.Xr gethostbyname 3 ,
81*133b8ab5SAlan Somers.Xr gethostbyname2 3 ,
82*133b8ab5SAlan Somers.Xr gethostbyaddr 3
83d06b4cefSMariusz Zaborskiand
84*133b8ab5SAlan Somers.Xr getnameinfo 3
85d06b4cefSMariusz Zaborskiexcept that the connection to the
86d06b4cefSMariusz Zaborski.Nm system.dns
87d06b4cefSMariusz Zaborskiservice needs to be provided.
88d06b4cefSMariusz Zaborski.Pp
89d06b4cefSMariusz ZaborskiThe
90d06b4cefSMariusz Zaborski.Fn cap_dns_type_limit
91d06b4cefSMariusz Zaborskifunction limits the functions allowed in the service.
92d06b4cefSMariusz ZaborskiThe
93d06b4cefSMariusz Zaborski.Fa types
94d06b4cefSMariusz Zaborskivariable can be set to
95752d135eSMariusz Zaborski.Dv ADDR2NAME
96d06b4cefSMariusz Zaborskior
97752d135eSMariusz Zaborski.Dv NAME2ADDR .
98d06b4cefSMariusz ZaborskiSee the
99d06b4cefSMariusz Zaborski.Sx LIMITS
100d06b4cefSMariusz Zaborskisection for more details.
101d06b4cefSMariusz ZaborskiThe
102d06b4cefSMariusz Zaborski.Fa ntpyes
103d06b4cefSMariusz Zaborskivariable contains the number of
104d06b4cefSMariusz Zaborski.Fa types
105d06b4cefSMariusz Zaborskiprovided.
106d06b4cefSMariusz Zaborski.Pp
107d06b4cefSMariusz ZaborskiThe
108d06b4cefSMariusz Zaborski.Fn cap_dns_family_limit
109d06b4cefSMariusz Zaborskifunctions allows to limit address families.
110d06b4cefSMariusz ZaborskiFor details see
111d06b4cefSMariusz Zaborski.Sx LIMITS .
112d06b4cefSMariusz ZaborskiThe
113d06b4cefSMariusz Zaborski.Fa nfamilies
114d06b4cefSMariusz Zaborskivariable contains the number of
115d06b4cefSMariusz Zaborski.Fa families
116d06b4cefSMariusz Zaborskiprovided.
117d06b4cefSMariusz Zaborski.Sh LIMITS
118d06b4cefSMariusz ZaborskiThe preferred way of setting limits is to use the
119d06b4cefSMariusz Zaborski.Fn cap_dns_type_limit
120d06b4cefSMariusz Zaborskiand
121d06b4cefSMariusz Zaborski.Fn cap_dns_family_limit
122d06b4cefSMariusz Zaborskifunctions, but the limits of service can be set also using
123d06b4cefSMariusz Zaborski.Xr cap_limit_set 3 .
124a241c14fSMariusz ZaborskiThe
125a241c14fSMariusz Zaborski.Xr nvlist 9
126a241c14fSMariusz Zaborskifor that function can contain the following values and types:
127d06b4cefSMariusz Zaborski.Bl -ohang -offset indent
128d06b4cefSMariusz Zaborski.It type ( NV_TYPE_STRING )
129d06b4cefSMariusz ZaborskiThe
130d06b4cefSMariusz Zaborski.Va type
131d06b4cefSMariusz Zaborskican have two values:
132752d135eSMariusz Zaborski.Dv ADDR2NAME
133d06b4cefSMariusz Zaborskior
134752d135eSMariusz Zaborski.Dv NAME2ADDR .
135d06b4cefSMariusz ZaborskiThe
136fd253945SMariusz Zaborski.Dv ADDR2NAME
137577dff6aSMariusz Zaborskimeans that reverse DNS lookups are allowed with
138577dff6aSMariusz Zaborski.Fn cap_getnameinfo
139d06b4cefSMariusz Zaborskiand
140d06b4cefSMariusz Zaborski.Fn cap_gethostbyaddr
141577dff6aSMariusz Zaborskifunctions.
142d06b4cefSMariusz ZaborskiIn case when
143d06b4cefSMariusz Zaborski.Va type
144d06b4cefSMariusz Zaborskiis set to
145fd253945SMariusz Zaborski.Dv NAME2ADDR
146577dff6aSMariusz Zaborskithe name resolution is allowed with
147577dff6aSMariusz Zaborski.Fn cap_getaddrinfo ,
148577dff6aSMariusz Zaborski.Fn cap_gethostbyname ,
149577dff6aSMariusz Zaborskiand
150577dff6aSMariusz Zaborski.Fn cap_gethostbyname2
151577dff6aSMariusz Zaborskifunctions.
152d06b4cefSMariusz Zaborski.It family ( NV_TYPE_NUMBER )
153d06b4cefSMariusz ZaborskiThe
154d06b4cefSMariusz Zaborski.Va family
155d06b4cefSMariusz Zaborskilimits service to one of the address families (e.g.
156d06b4cefSMariusz Zaborski.Dv AF_INET , AF_INET6 ,
157d06b4cefSMariusz Zaborskietc.).
158d06b4cefSMariusz Zaborski.Sh EXAMPLES
159d06b4cefSMariusz ZaborskiThe following example first opens a capability to casper and then uses this
160d06b4cefSMariusz Zaborskicapability to create the
161d06b4cefSMariusz Zaborski.Nm system.dns
162d06b4cefSMariusz Zaborskicasper service and uses it to resolve an IP address.
163d06b4cefSMariusz Zaborski.Bd -literal
164d06b4cefSMariusz Zaborskicap_channel_t *capcas, *capdns;
165db9a6e41SMariusz Zaborskiint familylimit, error;
166d06b4cefSMariusz Zaborskiconst char *ipstr = "127.0.0.1";
167fd253945SMariusz Zaborskiconst char *typelimit = "ADDR2NAME";
168db9a6e41SMariusz Zaborskichar hname[NI_MAXHOST];
169db9a6e41SMariusz Zaborskistruct addrinfo hints, *res;
170d06b4cefSMariusz Zaborski
171d06b4cefSMariusz Zaborski/* Open capability to Casper. */
172d06b4cefSMariusz Zaborskicapcas = cap_init();
173d06b4cefSMariusz Zaborskiif (capcas == NULL)
174d06b4cefSMariusz Zaborski	err(1, "Unable to contact Casper");
175d06b4cefSMariusz Zaborski
176db9a6e41SMariusz Zaborski/* Cache NLA for gai_strerror. */
177db9a6e41SMariusz Zaborskicaph_cache_catpages();
178db9a6e41SMariusz Zaborski
179d06b4cefSMariusz Zaborski/* Enter capability mode sandbox. */
180db9a6e41SMariusz Zaborskiif (caph_enter() < 0)
181d06b4cefSMariusz Zaborski	err(1, "Unable to enter capability mode");
182d06b4cefSMariusz Zaborski
183d06b4cefSMariusz Zaborski/* Use Casper capability to create capability to the system.dns service. */
184d06b4cefSMariusz Zaborskicapdns = cap_service_open(capcas, "system.dns");
185d06b4cefSMariusz Zaborskiif (capdns == NULL)
186d06b4cefSMariusz Zaborski	err(1, "Unable to open system.dns service");
187d06b4cefSMariusz Zaborski
188d06b4cefSMariusz Zaborski/* Close Casper capability, we don't need it anymore. */
189d06b4cefSMariusz Zaborskicap_close(capcas);
190d06b4cefSMariusz Zaborski
191d06b4cefSMariusz Zaborski/* Limit system.dns to reserve IPv4 addresses */
192d06b4cefSMariusz Zaborskifamilylimit = AF_INET;
193d06b4cefSMariusz Zaborskiif (cap_dns_family_limit(capdns, &familylimit, 1) < 0)
194d06b4cefSMariusz Zaborski	err(1, "Unable to limit access to the system.dns service");
195d06b4cefSMariusz Zaborski
196db9a6e41SMariusz Zaborski/* Convert IP address in C-string to struct sockaddr. */
197db9a6e41SMariusz Zaborskimemset(&hints, 0, sizeof(hints));
198db9a6e41SMariusz Zaborskihints.ai_family = familylimit;
199db9a6e41SMariusz Zaborskihints.ai_flags = AI_NUMERICHOST;
200db9a6e41SMariusz Zaborskierror = cap_getaddrinfo(capdns, ipstr, NULL, &hints, &res);
201db9a6e41SMariusz Zaborskiif (error != 0)
202db9a6e41SMariusz Zaborski       errx(1, "cap_getaddrinfo(): %s: %s", ipstr, gai_strerror(error));
203db9a6e41SMariusz Zaborski
204db9a6e41SMariusz Zaborski/* Limit system.dns to reverse DNS lookups. */
205db9a6e41SMariusz Zaborskiif (cap_dns_type_limit(capdns, &typelimit, 1) < 0)
206db9a6e41SMariusz Zaborski	err(1, "Unable to limit access to the system.dns service");
207d06b4cefSMariusz Zaborski
208d06b4cefSMariusz Zaborski/* Find hostname for the given IP address. */
209db9a6e41SMariusz Zaborskierror = cap_getnameinfo(capdns, res->ai_addr, res->ai_addrlen, hname, sizeof(hname),
210db9a6e41SMariusz Zaborski    NULL, 0, 0);
211db9a6e41SMariusz Zaborskiif (error != 0)
212db9a6e41SMariusz Zaborski	errx(1, "cap_getnameinfo(): %s: %s", ipstr, gai_strerror(error));
213d06b4cefSMariusz Zaborski
214db9a6e41SMariusz Zaborskiprintf("Name associated with %s is %s.\\n", ipstr, hname);
215d06b4cefSMariusz Zaborski.Ed
216d06b4cefSMariusz Zaborski.Sh SEE ALSO
217d06b4cefSMariusz Zaborski.Xr cap_enter 2 ,
218db9a6e41SMariusz Zaborski.Xr caph_enter 3 ,
219d06b4cefSMariusz Zaborski.Xr err 3 ,
220d06b4cefSMariusz Zaborski.Xr gethostbyaddr 3 ,
221d06b4cefSMariusz Zaborski.Xr gethostbyname 3 ,
222d06b4cefSMariusz Zaborski.Xr gethostbyname2 3 ,
223d06b4cefSMariusz Zaborski.Xr getnameinfo 3 ,
22485ebe1f1SMariusz Zaborski.Xr capsicum 4 ,
22585ebe1f1SMariusz Zaborski.Xr nv 9
226d06b4cefSMariusz Zaborski.Sh AUTHORS
227d06b4cefSMariusz ZaborskiThe
228d06b4cefSMariusz Zaborski.Nm cap_dns
229d06b4cefSMariusz Zaborskiservice was implemented by
230d06b4cefSMariusz Zaborski.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net
231d06b4cefSMariusz Zaborskiunder sponsorship from the FreeBSD Foundation.
232d06b4cefSMariusz Zaborski.Pp
233d06b4cefSMariusz ZaborskiThis manual page was written by
234d06b4cefSMariusz Zaborski.An Mariusz Zaborski Aq Mt oshogbo@FreeBSD.org .
235