xref: /freebsd/lib/libcasper/services/cap_grp/cap_grp.3 (revision c8b31033c3971b2b7349804ffda0cea5e4835b40)
156a79104SMariusz Zaborski.\" Copyright (c) 2018 Mariusz Zaborski <oshogbo@FreeBSD.org>
256a79104SMariusz Zaborski.\" All rights reserved.
356a79104SMariusz Zaborski.\"
456a79104SMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without
556a79104SMariusz Zaborski.\" modification, are permitted provided that the following conditions
656a79104SMariusz Zaborski.\" are met:
756a79104SMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright
856a79104SMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer.
956a79104SMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright
1056a79104SMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer in the
1156a79104SMariusz Zaborski.\"    documentation and/or other materials provided with the distribution.
1256a79104SMariusz Zaborski.\"
1356a79104SMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
1456a79104SMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1556a79104SMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1656a79104SMariusz Zaborski.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
1756a79104SMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1856a79104SMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1956a79104SMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2056a79104SMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2156a79104SMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2256a79104SMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2356a79104SMariusz Zaborski.\" SUCH DAMAGE.
2456a79104SMariusz Zaborski.\"
25cf037972SAlan Somers.Dd December 6, 2023
2656a79104SMariusz Zaborski.Dt CAP_GRP 3
2756a79104SMariusz Zaborski.Os
2856a79104SMariusz Zaborski.Sh NAME
2956a79104SMariusz Zaborski.Nm cap_getgrent ,
3056a79104SMariusz Zaborski.Nm cap_getgrnam ,
3156a79104SMariusz Zaborski.Nm cap_getgrgid ,
3256a79104SMariusz Zaborski.Nm cap_getgrent_r ,
3356a79104SMariusz Zaborski.Nm cap_getgrnam_r ,
3456a79104SMariusz Zaborski.Nm cap_getgrgid_r ,
3556a79104SMariusz Zaborski.Nm cap_setgroupent ,
3656a79104SMariusz Zaborski.Nm cap_setgrent ,
3756a79104SMariusz Zaborski.Nm cap_endgrent ,
3856a79104SMariusz Zaborski.Nm cap_grp_limit_cmds ,
3956a79104SMariusz Zaborski.Nm cap_grp_limit_fields ,
4056a79104SMariusz Zaborski.Nm cap_grp_limit_groups
4156a79104SMariusz Zaborski.Nd "library for group database operations in capability mode"
4256a79104SMariusz Zaborski.Sh LIBRARY
4356a79104SMariusz Zaborski.Lb libcap_grp
4456a79104SMariusz Zaborski.Sh SYNOPSIS
4556a79104SMariusz Zaborski.In sys/nv.h
4656a79104SMariusz Zaborski.In libcasper.h
4756a79104SMariusz Zaborski.In casper/cap_grp.h
4856a79104SMariusz Zaborski.Ft "struct group *"
4956a79104SMariusz Zaborski.Fn cap_getgrent "cap_channel_t *chan"
5056a79104SMariusz Zaborski.Ft "struct group *"
5156a79104SMariusz Zaborski.Fn cap_getgrnam "cap_channel_t *chan" "const char *name"
5256a79104SMariusz Zaborski.Ft "struct group *"
5356a79104SMariusz Zaborski.Fn cap_getgrgid "cap_channel_t *chan" "gid_t gid"
5456a79104SMariusz Zaborski.Ft "int"
5556a79104SMariusz Zaborski.Fn cap_getgrent_r "cap_channel_t *chan" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result"
5656a79104SMariusz Zaborski.Ft "int"
5756a79104SMariusz Zaborski.Fn cap_getgrnam_r "cap_channel_t *chan" "const char *name" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result"
5856a79104SMariusz Zaborski.Ft int
5956a79104SMariusz Zaborski.Fn cap_getgrgid_r "cap_channel_t *chan" "gid_t gid" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result"
6056a79104SMariusz Zaborski.Ft int
6156a79104SMariusz Zaborski.Fn cap_setgroupent "cap_channel_t *chan" "int stayopen"
62*c8b31033SGraham Percival.Ft int
6356a79104SMariusz Zaborski.Fn cap_setgrent "cap_channel_t *chan"
6456a79104SMariusz Zaborski.Ft void
6556a79104SMariusz Zaborski.Fn cap_endgrent "cap_channel_t *chan"
6656a79104SMariusz Zaborski.Ft int
6756a79104SMariusz Zaborski.Fn cap_grp_limit_cmds "cap_channel_t *chan" "const char * const *cmds" "size_t ncmds"
6856a79104SMariusz Zaborski.Ft int
6956a79104SMariusz Zaborski.Fn cap_grp_limit_fields "cap_channel_t *chan" "const char * const *fields" "size_t nfields"
7056a79104SMariusz Zaborski.Ft int
714468cd1aSMariusz Zaborski.Fn cap_grp_limit_groups "cap_channel_t *chan" "const char * const *names" "size_t nnames" "const gid_t *gids" "size_t ngids"
7256a79104SMariusz Zaborski.Sh DESCRIPTION
7356a79104SMariusz ZaborskiThe functions
7456a79104SMariusz Zaborski.Fn cap_getgrent ,
7556a79104SMariusz Zaborski.Fn cap_getgrnam ,
7656a79104SMariusz Zaborski.Fn cap_getgrgid ,
7756a79104SMariusz Zaborski.Fn cap_getgrent_r ,
7856a79104SMariusz Zaborski.Fn cap_getgrnam_r ,
7956a79104SMariusz Zaborski.Fn cap_getgrgid_r ,
8056a79104SMariusz Zaborski.Fn cap_setgroupent ,
8156a79104SMariusz Zaborski.Fn cap_setgrent ,
8256a79104SMariusz Zaborskiand
8356a79104SMariusz Zaborski.Fn cap_endgrent
8456a79104SMariusz Zaborskiare respectively equivalent to
8556a79104SMariusz Zaborski.Xr getgrent 3 ,
8656a79104SMariusz Zaborski.Xr getgrnam 3 ,
8756a79104SMariusz Zaborski.Xr getgrgid 3 ,
8856a79104SMariusz Zaborski.Xr getgrent_r 3 ,
8956a79104SMariusz Zaborski.Xr getgrnam_r 3 ,
9056a79104SMariusz Zaborski.Xr getgrgid_r 3 ,
9156a79104SMariusz Zaborski.Xr setgroupent 3 ,
9256a79104SMariusz Zaborski.Xr setgrent 3 ,
9356a79104SMariusz Zaborskiand
9456a79104SMariusz Zaborski.Xr endgrent 3
9556a79104SMariusz Zaborskiexcept that the connection to the
9656a79104SMariusz Zaborski.Nm system.grp
9756a79104SMariusz Zaborskiservice needs to be provided.
9856a79104SMariusz Zaborski.Pp
9956a79104SMariusz ZaborskiThe
10056a79104SMariusz Zaborski.Fn cap_grp_limit_cmds
10156a79104SMariusz Zaborskifunction limits the functions allowed in the service.
10256a79104SMariusz ZaborskiThe
10356a79104SMariusz Zaborski.Fa cmds
1048763ae35SMariusz Zaborskivariable can be set to
10556a79104SMariusz Zaborski.Dv getgrent ,
10656a79104SMariusz Zaborski.Dv getgrnam ,
10756a79104SMariusz Zaborski.Dv getgrgid ,
10856a79104SMariusz Zaborski.Dv getgrent_r ,
10956a79104SMariusz Zaborski.Dv getgrnam_r ,
11056a79104SMariusz Zaborski.Dv getgrgid_r ,
11156a79104SMariusz Zaborski.Dv setgroupent ,
11256a79104SMariusz Zaborski.Dv setgrent ,
11356a79104SMariusz Zaborskior
11456a79104SMariusz Zaborski.Dv endgrent
11556a79104SMariusz Zaborskiwhich will allow to use the function associated with the name.
11656a79104SMariusz ZaborskiThe
11756a79104SMariusz Zaborski.Fa ncmds
11856a79104SMariusz Zaborskivariable contains the number of
11956a79104SMariusz Zaborski.Fa cmds
12056a79104SMariusz Zaborskiprovided.
12156a79104SMariusz Zaborski.Pp
12256a79104SMariusz ZaborskiThe
12356a79104SMariusz Zaborski.Fn cap_grp_limit_fields
12456a79104SMariusz Zaborskifunction allows limit fields returned in the structure
12556a79104SMariusz Zaborski.Vt group .
12656a79104SMariusz ZaborskiThe
12756a79104SMariusz Zaborski.Fa fields
12856a79104SMariusz Zaborskivariable can be set to
12956a79104SMariusz Zaborski.Dv gr_name
13056a79104SMariusz Zaborski.Dv gr_passwd
13156a79104SMariusz Zaborski.Dv gr_gid
13256a79104SMariusz Zaborskior
13356a79104SMariusz Zaborski.Dv gr_mem .
13456a79104SMariusz ZaborskiThe field which was set as the limit will be returned, while the rest of the
13556a79104SMariusz Zaborskivalues not set this way will have default values.
13656a79104SMariusz ZaborskiThe
13756a79104SMariusz Zaborski.Fa nfields
13856a79104SMariusz Zaborskivariable contains the number of
13956a79104SMariusz Zaborski.Fa fields
14056a79104SMariusz Zaborskiprovided.
14156a79104SMariusz Zaborski.Pp
14256a79104SMariusz ZaborskiThe
14356a79104SMariusz Zaborski.Fn cap_grp_limit_groups
14456a79104SMariusz Zaborskifunction allows to limit access to groups.
14556a79104SMariusz ZaborskiThe
14656a79104SMariusz Zaborski.Fa names
14756a79104SMariusz Zaborskivariable allows to limit groups by name and the
14856a79104SMariusz Zaborski.Fa gids
14956a79104SMariusz Zaborskivariable by the group number.
15056a79104SMariusz ZaborskiThe
15156a79104SMariusz Zaborski.Fa nnames
15256a79104SMariusz Zaborskiand
15356a79104SMariusz Zaborski.Fa ngids
15456a79104SMariusz Zaborskivariables provide numbers of limited names and gids.
155cf037972SAlan Somers.Pp
156cf037972SAlan SomersAll of these functions are reentrant but not thread-safe.
157cf037972SAlan SomersThat is, they may be called from separate threads only with different
158cf037972SAlan Somers.Vt cap_channel_t
159cf037972SAlan Somersarguments or with synchronization.
16056a79104SMariusz Zaborski.Sh EXAMPLES
16156a79104SMariusz ZaborskiThe following example first opens a capability to casper and then uses this
16256a79104SMariusz Zaborskicapability to create the
16356a79104SMariusz Zaborski.Nm system.grp
16456a79104SMariusz Zaborskicasper service and uses it to get a group name.
16556a79104SMariusz Zaborski.Bd -literal
16656a79104SMariusz Zaborskicap_channel_t *capcas, *capgrp;
16756a79104SMariusz Zaborskiconst char *cmds[] = { "getgrgid" };
16856a79104SMariusz Zaborskiconst char *fields[] = { "gr_name" };
1694468cd1aSMariusz Zaborskiconst gid_t gid[] = { 1 };
17056a79104SMariusz Zaborskistruct group *group;
17156a79104SMariusz Zaborski
17256a79104SMariusz Zaborski/* Open capability to Casper. */
17356a79104SMariusz Zaborskicapcas = cap_init();
17456a79104SMariusz Zaborskiif (capcas == NULL)
17556a79104SMariusz Zaborski        err(1, "Unable to contact Casper");
17656a79104SMariusz Zaborski
17756a79104SMariusz Zaborski/* Enter capability mode sandbox. */
17856a79104SMariusz Zaborskiif (cap_enter() < 0 && errno != ENOSYS)
17956a79104SMariusz Zaborski        err(1, "Unable to enter capability mode");
18056a79104SMariusz Zaborski
18156a79104SMariusz Zaborski/* Use Casper capability to create capability to the system.grp service. */
18256a79104SMariusz Zaborskicapgrp = cap_service_open(capcas, "system.grp");
18356a79104SMariusz Zaborskiif (capgrp == NULL)
18456a79104SMariusz Zaborski        err(1, "Unable to open system.grp service");
18556a79104SMariusz Zaborski
18656a79104SMariusz Zaborski/* Close Casper capability, we don't need it anymore. */
18756a79104SMariusz Zaborskicap_close(capcas);
18856a79104SMariusz Zaborski
18956a79104SMariusz Zaborski/* Limit service to one single function. */
19056a79104SMariusz Zaborskiif (cap_grp_limit_cmds(capgrp, cmds, nitems(cmds)))
19156a79104SMariusz Zaborski	err(1, "Unable to limit access to system.grp service");
19256a79104SMariusz Zaborski
19356a79104SMariusz Zaborski/* Limit service to one field as we only need name of the group. */
19456a79104SMariusz Zaborskiif (cap_grp_limit_fields(capgrp, fields, nitems(fields)))
19556a79104SMariusz Zaborski	err(1, "Unable to limit access to system.grp service");
19656a79104SMariusz Zaborski
19756a79104SMariusz Zaborski/* Limit service to one gid. */
19856a79104SMariusz Zaborskiif (cap_grp_limit_groups(capgrp, NULL, 0, gid, nitems(gid)))
19956a79104SMariusz Zaborski	err(1, "Unable to limit access to system.grp service");
20056a79104SMariusz Zaborski
20156a79104SMariusz Zaborskigroup = cap_getgrgid(capgrp, gid[0]);
20256a79104SMariusz Zaborskiif (group == NULL)
20356a79104SMariusz Zaborski	err(1, "Unable to get name of group");
20456a79104SMariusz Zaborski
20556a79104SMariusz Zaborskiprintf("GID %d is associated with name %s.\\n", gid[0], group->gr_name);
20656a79104SMariusz Zaborski
20756a79104SMariusz Zaborskicap_close(capgrp);
20856a79104SMariusz Zaborski.Ed
20956a79104SMariusz Zaborski.Sh SEE ALSO
21056a79104SMariusz Zaborski.Xr cap_enter 2 ,
21156a79104SMariusz Zaborski.Xr endgrent 3 ,
21256a79104SMariusz Zaborski.Xr err 3 ,
21356a79104SMariusz Zaborski.Xr getgrent 3 ,
21456a79104SMariusz Zaborski.Xr getgrent_r 3 ,
21556a79104SMariusz Zaborski.Xr getgrgid 3 ,
21656a79104SMariusz Zaborski.Xr getgrgid_r 3 ,
21756a79104SMariusz Zaborski.Xr getgrnam 3 ,
21856a79104SMariusz Zaborski.Xr getgrnam_r 3 ,
21956a79104SMariusz Zaborski.Xr setgrent 3 ,
22056a79104SMariusz Zaborski.Xr setgroupent 3 ,
22185ebe1f1SMariusz Zaborski.Xr capsicum 4 ,
22285ebe1f1SMariusz Zaborski.Xr nv 9
223421f325eSGordon Bergling.Sh HISTORY
224421f325eSGordon BerglingThe
225421f325eSGordon Bergling.Nm cap_grp
226421f325eSGordon Berglingservice first appeared in
227421f325eSGordon Bergling.Fx 10.3 .
22856a79104SMariusz Zaborski.Sh AUTHORS
22956a79104SMariusz ZaborskiThe
23056a79104SMariusz Zaborski.Nm cap_grp
23156a79104SMariusz Zaborskiservice was implemented by
23256a79104SMariusz Zaborski.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net
23356a79104SMariusz Zaborskiunder sponsorship from the FreeBSD Foundation.
23456a79104SMariusz Zaborski.Pp
23556a79104SMariusz ZaborskiThis manual page was written by
23656a79104SMariusz Zaborski.An Mariusz Zaborski Aq Mt oshogbo@FreeBSD.org .
237