1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21
22 #
23 # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 # Use is subject to license terms.
25 #
26 # ident "@(#)README 1.4 08/11/21 SMI"
27 #
28
29 runwattr - Run With Attributes
30
31 This tool provides a simple interface so that test cases can
32 execute programs with any desired credential level. This
33 currently includes manipulation of the real/effective uid/gid,
34 privileges, and zone. In addition, environment variables can
35 be changed or added.
36
37 runwattr can be thought of as a "filter" on the credentials of
38 the programs run under it. In other words, invoking "runwattr
39 someutility" would have the same effect as invoking
40 "someutility" directly. However, invoking "runwattr -z
41 somezone someutility" would switch to the alternate zone while
42 preserving as much as possible of the current context. There
43 are additional options described below to alter other aspects
44 of the credential context; these can be used together in any
45 desired combination.
46
47 Usage:
48
49 runwattr [-u uid] [-U uid] [-g gid] [-G gid]
50 [-p priv_mod ...]
51 [-z zonename]
52 [-i] [-e name=value ...]
53 [-D]
54 [--] command [args ...]
55
56 The uid/gid options manipulate user and group ids:
57 -u and -g will set both the real and effective uid or gid.
58 -U and -G will set the real uid or gid only, and can also be
59 used together with -u and -g to set a real uid or gid that is
60 different from the effective uid or gid set by -u or -g.
61
62 The priv_mod syntax is: [=+-]priv_name[,priv_name]*
63 = will explicitly set the listed priv_name(s)
64 + and - will add or remove the listed priv_name(s) to
65 the current privileges.
66
67 The -z option specifies the desired zone in which to execute
68 the command. If the specified zone matches the current zone,
69 the option is ignored and no special action is taken. When
70 runwattr is invoked in the global zone, this option can be
71 used to change to a non-global zone. When runwattr is
72 invoked in a non-global zone, the only valid value for this
73 option is to specify the current zone, which would be ignored
74 as described above.
75
76 The -i and -e options manipulate environment variables.
77 By default, the current environment variables will be
78 propagated into the environment of the child process.
79 -i will clear all variables from the current environment.
80 -e can be used to add or change additional variables.
81
82 The -D option enables extra debugging information.
83
84 Installation:
85
86 Several installation alternatives are available:
87
88 1) Package Installation:
89
90 This method uses the standard STF techniques to create a
91 Solaris package, which will be installed under the base
92 directory "/opt/SUNWstc-runwattr".
93
94 Briefly, this installation is performed as follows:
95
96 # set path to STF bin directory
97 PATH=<path-to-STF>/bin/`uname -p`:$PATH
98 export PATH
99
100 # WS_ROOT represents the root of the STC workspace
101 cd <WS_ROOT>/usr/src/tools/runwattr
102 stf_build package
103 cd <WS_ROOT>/packages/`uname -p`
104 pkgadd -d `pwd` SUNWstc-runwattr
105
106 (NOTE: stf_build is part of the SUNWstc-stf package)
107
108 To uninstall:
109
110 pkgrm SUNWstc-runwattr
111
112 2) Manual Installation:
113
114 These steps can be used if STF or a SUNWstc-runwattr
115 package are unavailable. In addition, this method
116 allows the flexibility to install runwattr in any
117 location.
118
119 The following steps will use the variable ${BASEDIR}
120 to identify the root of the installation; this can
121 be changed to any desired location.
122
123 # define location for installation
124 BASEDIR=/usr/local
125
126 # install runwattr script
127 mkdir -p ${BASEDIR}/bin
128 cp -p bin/runwattr.pl ${BASEDIR}/bin/runwattr
129 chmod +x ${BASEDIR}/bin/runwattr
130
131 # install "forcepriv" helper binaries
132 /usr/bin/ksh -p bin/runwattr_admin.ksh \
133 install -s ${BASEDIR}/lib/forcepriv
134
135 To uninstall:
136
137 # remove runwattr script
138 rm -f ${BASEDIR}/bin/runwattr
139
140 # remove "forcepriv" helper binaries
141 /usr/bin/ksh -p bin/runwattr_admin.ksh \
142 uninstall ${BASEDIR}/lib/forcepriv
143
144 3) Network installation:
145
146 This is simply a variation on the "manual" installation
147 steps described above that can be used when the main
148 runwattr script is already installed in a shared network
149 location. On the local system, only the "runwattr_admin"
150 steps from the "manual" installation method need to be
151 performed.
152
153 Because the "forcepriv" scripts are not installed in a fixed
154 location relative to the runwattr script, the environment
155 variable RUNWATTR_FORCEPRIV may be used to tell the runwattr
156 script where to find the "forcepriv" binaries.
157
158 RUNWATTR_FORCEPRIV=/usr/local/lib/forcepriv
159 export RUNWATTR_FORCEPRIV
160 runwattr_admin install -s ${RUNWATTR_FORCEPRIV}
161 # test execution steps using runwattr go here
162 runwattr_admin uninstall ${RUNWATTR_FORCEPRIV}
163
164 The runwattr and runwattr_admin scripts both acknowledge
165 the path "/var/tmp/SUNWstc-runwattr/forcepriv" as a
166 default location for the "forcepriv" binaries. If this
167 location is used, no environment variable is required
168 and the steps are simply as follows:
169
170 runwattr_admin install -s
171 # test execution steps using runwattr go here
172 runwattr_admin uninstall
173
174 RBAC alternative for forcepriv:
175
176 All of the above procedures will create a setuid/setgid
177 root binary on the system. This can then be used by any
178 system user to gain all privileges. If this is not desired,
179 RBAC can be used to restrict the utility to designated users.
180
181 1) Remove the setuid bit from the forcepriv helper binary.
182
183 If runwattr is installed via a package, this must be done
184 with a command such as the following. Be sure to replace
185 the "/opt/SUNWstc-runwattr" portion of the pathname if
186 another installation location was chosen.
187
188 chmod -s /opt/SUNWstc-runwattr/lib/forcepriv
189
190 If runwattr is installed using the "manual" or "network"
191 methods described above, simply omit the "-s" option
192 from the "runwattr_admin install" command.
193
194 2) Add entries for the runwattr tools to the system's
195 prof_attr(4) and exec_attr(4) databases.
196
197 Sample entries are provided in the "etc/security"
198 directory of this distribution. Be sure to replace
199 the "/opt/SUNWstc-runwattr" portion of the pathnames
200 in exec_attr(4) if another installation location was
201 chosen.
202
203 3) Add the "Solaris Test Collection runwattr" profile to
204 the user_attr(4) database for user accounts that are
205 authorized to use the tool.
206
207 For further details on RBAC, see the "Roles, Rights Profiles,
208 and Privileges" section of the __Solaris System Administration
209 Guide: Security Services__ and the prof_attr(4), exec_attr(4)
210 and user_attr(4) man pages.
211
212 Further details on the location of "forcepriv" helper binaries:
213
214 The "forcepriv" helper binaries are located at runwattr
215 execution time by searching for the first match against
216 the following list of locations:
217
218 1) The full path specified by the RUNWATTR_FORCEPRIV
219 environment variable, if it is set.
220
221 2) The standard path "/var/tmp/SUNWstc-runwattr/forcepriv",
222 which is the default location for "network" installations.
223
224 3) The standard path "/opt/SUNWstc-runwattr/lib/forcepriv",
225 which is the default location for "package" installations.
226
227 4) A path derived from the location of the runwattr script
228 itself. This algoritm assumes that if the runwattr script
229 is installed as /some_path_name/bin/runwattr then the
230 forcepriv binary would be /some_path_name/lib/forcepriv.
231
232 Like the runwattr script itself, copies of these binaries
233 must be created at the same location in each system zone.
234 The following commands are used to maintain these copies:
235
236 runwattr_admin install [ -z <zonename> ] [ -s ] [ <forcepriv_path> ]
237 runwattr_admin uninstall [ -z <zonename> ] [ <forcepriv_path> ]
238
239 The "install" and "uninstall" subcommands indicate whether
240 the forcepriv binaries should be created or removed.
241
242 The "-z <zonename>" option (which may be repeated) indicates
243 which system zones are manipulated during each invocation of
244 runwattr_admin. By default, when this command is used in the
245 global zone, ALL system zones are included; when used in a
246 non-global zone, only that zone is included.
247
248 The "-s" option indicates that the runwattr_admin script
249 should apply "setuid/setgid root" permissions to the forcepriv
250 binaries that are created. The invoking prcess must already
251 have super-user credentials to use this option.
252
253 The optional "<forcepriv_path>" argument may be used to
254 explicitly state the location where the forcepriv binaries
255 should be created:
256
257 1) The path given in the "<forcepriv_path>" argument is
258 always used when it is provided.
259
260 2) Otherwise, the path given in the RUNWATTR_FORCEPRIV
261 environment variable is used if it is defined.
262
263 3) Otherwise, "/var/tmp/SUNWstc-runwattr/forcepriv" is
264 used by default.
265
266 When "runwattr_admin install" is executed, a single final
267 subdirectory component of the "<forcepriv_path>" argument
268 (for example, the "SUNWstc-runwattr" directory from the
269 full path "/var/tmp/SUNWstc-runwattr/forcepriv") will be
270 created if needed. Similarly, when "runwattr_admin uninstall"
271 is executed, the final subdirectory will be removed if it
272 would otherwise be empty.
273
274 Limitations:
275
276 The restriction on movement between zones (with the -z
277 option) is imposed by the zones(5) model and applies in
278 all cases.
279
280 Modification of any attribute of a credential context which
281 has a security impact (with the -uUgGpz options) is subject
282 to the limitations described in ppriv(1) and privileges(5).
283
284 Typically, this requires that user invoking runwattr be able
285 to run the associated "forcepriv" utility with all privileges.
286 This can be achieved by the following methods:
287
288 - Installing forcepriv as a setuid/setgid 0 binary.
289 - Using RBAC profiles to asign this right to users.
290 - Invoking the runwattr utility as the super-user.
291
292 In other cases, modification of the credential context is
293 restricted to those changes that the invoking user would
294 have been able to achieve through their preexisting privilege
295 level:
296
297 - Switching zones may not be possible.
298 - Changes to uid/gid may not be possible.
299 - Privileges may only be reduced.
300
301 The -e and -i options may be used freely without limitation.
302
303 Examples:
304
305 In the following two examples, the command "zonename ; id ;
306 ppriv -S $$" is executed twice. The first invocation
307 displays the existing credential context, the second
308 shows how it is modified with runwattr:
309
310 1) From within the public zone, operating as a normal user,
311 invoke a command as a different user with additional
312 privileges:
313
314 % zonename ; id ; ppriv -S $$
315 public
316 uid=1001(tester) gid=10(staff)
317 143968: ksh
318 flags = <none>
319 E: basic
320 I: basic
321 P: basic
322 L: zone
323 % runwattr \
324 -u nobody -g nobody \
325 -p +file_dac_read \
326 'zonename ; id ; ppriv -S $$'
327 public
328 uid=60001(nobody) gid=60001(nobody)
329 144046: sh -c zonename ; id ; ppriv -S $$
330 flags = <none>
331 E: basic,file_dac_read
332 I: basic,file_dac_read
333 P: basic,file_dac_read
334 L: zone
335
336 2) From within the global zone, operating as the super user,
337 enter the public zone and execute a command with altered
338 uid, gid, and privilege:
339
340 # zonename ; id ; ppriv -S $$
341 global
342 uid=0(root) gid=0(root)
343 128876: ksh
344 flags = <none>
345 E: all
346 I: basic
347 P: all
348 L: all
349 # runwattr \
350 -z public \
351 -U tester -G staff \
352 -u nobody -g nobody \
353 -p -proc_info \
354 'zonename ; id ; ppriv -S $$'
355 public
356 uid=1001(tester) gid=10(staff) euid=60001(nobody) egid=60001(nobody)
357 144109: sh -c zonename ; id ; ppriv -S $$
358 flags = <none>
359 E: basic,!proc_info
360 I: basic,!proc_info
361 P: basic,!proc_info
362 L: zone
363
364 The following three examples show how environment variables
365 can be propagated between zones and manipulated with the
366 -e and -i options:
367
368 1) Propagating environment variables between zones
369 automatically:
370
371 # zonename
372 global
373 # MY_SPECIAL_VARIABLE=foo
374 # export MY_SPECIAL_VARIABLE
375 # zlogin public 'env | grep MY_SPECIAL_VARIABLE'
376 # runwattr -z public 'env | grep MY_SPECIAL_VARIABLE'
377 MY_SPECIAL_VARIABLE=foo
378
379 2) Using -e to set extra environment variables:
380
381 # zonename
382 global
383 # unset MY_SPECIAL_VARIABLE
384 # env | grep MY_SPECIAL_VARIABLE
385 # runwattr \
386 -z public \
387 -e MY_SPECIAL_VARIABLE=foo \
388 'env | grep MY_SPECIAL_VARIABLE'
389 MY_SPECIAL_VARIABLE=foo
390
391 3) Using -i to severely limit the environment, removing
392 even those variables set automatically with zlogin(1).
393 "wc -l" is used to count the number of variables defined
394 in the global zone, set by zlogin, and left after using
395 "runwattr -i":
396
397 # zonename ; env | wc -l
398 global
399 45
400 # zlogin public 'zonename ; env | wc -l'
401 public
402 7
403 # runwattr -z public -i 'zonename ; env | wc -l'
404 public
405 0
406
407 Warnings:
408
409 This tool should only be installed on systems used for test
410 purposes, and never on a production or other sensitive system.
411
412 This tool will pass special shell environment variables
413 (such as PATH or IFS) along to the environment for the child
414 process. Make certain that this does not have unintended
415 consequences. In particular, make certain that the correct
416 child process commands are executed.
417
418 Notes:
419
420 This tool is implemented as a Perl script, with a helper binary
421 to force privileges. The helper is simply a copy of the normal
422 ppriv(1) program included in the OS.
423
424