jail - Rework sysctl configuration variables
[dragonfly.git] / sys / sys / jail.h
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  * $FreeBSD: src/sys/sys/jail.h,v 1.8.2.2 2000/11/01 17:58:06 rwatson Exp $
10  */
11
12 #ifndef _SYS_JAIL_H_
13 #define _SYS_JAIL_H_
14
15 #ifndef _SYS_TYPES_H_
16 #include <sys/types.h>
17 #endif
18 #ifndef _SYS_PARAM_H_
19 #include <sys/param.h>
20 #endif
21 #ifndef _SYS_QUEUE_H_
22 #include <sys/queue.h>
23 #endif
24 #ifndef _SYS_UCRED_H_
25 #include <sys/ucred.h>
26 #endif
27 #ifndef _NET_IF_H_
28 #include <net/if.h>
29 #endif
30 #ifndef _SYS_SYSCTL_H_
31 #include <sys/sysctl.h>
32 #endif
33
34
35 struct jail {
36         uint32_t        version;
37         char            *path;
38         char            *hostname;
39         uint32_t        n_ips;     /* Number of ips */
40         struct sockaddr_storage *ips;
41 };
42
43 struct jail_v0 {
44         uint32_t        version;
45         char            *path;
46         char            *hostname;
47         uint32_t        ip_number;
48 };
49
50 #ifndef _KERNEL
51
52 int jail(struct jail *);
53 int jail_attach(int);
54
55 #endif
56
57 #ifdef _KERNEL
58
59 #ifndef _SYS_NAMECACHE_H_
60 #include <sys/namecache.h>
61 #endif
62 #ifndef _SYS_VARSYM_H_
63 #include <sys/varsym.h>
64 #endif
65
66 #ifdef MALLOC_DECLARE
67 MALLOC_DECLARE(M_PRISON);
68 #endif
69
70 #endif  /* _KERNEL */
71
72 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
73
74 #define JAIL_MAX        999999
75
76 /* Used to store the IPs of the jail */
77
78 struct jail_ip_storage {
79         struct sockaddr_storage ip;
80         SLIST_ENTRY(jail_ip_storage) entries;
81 };
82
83 /*
84  * This structure describes a prison.  It is pointed to by all struct
85  * ucred's of the inmates.  pr_ref keeps track of them and is used to
86  * delete the struture when the last inmate is dead.
87  */
88
89 struct prison {
90         LIST_ENTRY(prison) pr_list;                     /* all prisons */
91         int             pr_id;                          /* prison id */
92         int             pr_ref;                         /* reference count */
93         struct nchandle pr_root;                        /* namecache entry of root */
94         char            pr_host[MAXHOSTNAMELEN];        /* host name */
95         SLIST_HEAD(iplist, jail_ip_storage) pr_ips;     /* list of IP addresses */
96         struct sockaddr_in      *local_ip4;             /* cache for a loopback ipv4 address */
97         struct sockaddr_in      *nonlocal_ip4;          /* cache for a non loopback ipv4 address */
98         struct sockaddr_in6     *local_ip6;             /* cache for a loopback ipv6 address */
99         struct sockaddr_in6     *nonlocal_ip6;          /* cache for a non loopback ipv6 address */
100         void            *pr_linux;                      /* Linux ABI emulation */
101         int              pr_securelevel;                /* jail securelevel */
102         struct varsymset pr_varsymset;                  /* jail varsyms */
103
104         struct sysctl_ctx_list *pr_sysctl_ctx;
105         struct sysctl_oid *pr_sysctl_tree;
106
107         int8_t          pr_set_hostname_allowed;
108         int8_t          pr_socket_unixiproute_only;
109         int8_t          pr_sysvipc_allowed;
110         int8_t          pr_chflags_allowed;
111         int8_t          pr_allow_raw_sockets;
112 };
113
114 /*
115  * Sysctl-set variables that determine global jail policy
116  */
117 extern int      jail_set_hostname_allowed;
118 extern int      jail_socket_unixiproute_only;
119 extern int      jail_sysvipc_allowed;
120 extern int      jail_chflags_allowed;
121 extern int      jail_allow_raw_sockets;
122
123 /*
124  * Kernel support functions for jail.
125  */
126 int     jailed_ip(struct prison *, struct sockaddr *);
127 void    prison_free(struct prison *);
128 void    prison_hold(struct prison *);
129 int     prison_if(struct ucred *cred, struct sockaddr *sa);
130 struct sockaddr *
131         prison_get_local(struct prison *pr, sa_family_t, struct sockaddr *);
132 struct sockaddr *
133         prison_get_nonlocal(struct prison *pr, sa_family_t, struct sockaddr *);
134 int     prison_priv_check(struct ucred *cred, int priv);
135 int     prison_remote_ip(struct thread *td, struct sockaddr *ip);
136 int     prison_replace_wildcards(struct thread *td, struct sockaddr *ip);
137 int     prison_sysctl_create(struct prison *);
138 int     prison_sysctl_done(struct prison *);
139
140 /*
141  * Return 1 if the passed credential is in a jail, otherwise 0.
142  *
143  * MPSAFE
144  */
145 static __inline int
146 jailed(struct ucred *cred)
147 {
148         return(cred->cr_prison != NULL);
149 }
150
151 #endif /* _KERNEL || _KERNEL_STRUCTURES */
152 #endif /* !_SYS_JAIL_H_ */