210 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
| #!/bin/bash
 | |
| # vim:expandtab:tabstop=4
 | |
| #
 | |
| # author:    chris friedhoff - chris@friedhoff.org
 | |
| # version:   pcaps4convenience  2  Tue Mar 11 2008
 | |
| #
 | |
| #
 | |
| # changelog:
 | |
| # 1 - initial release pcaps4convenience
 | |
| # 2 - changed 'attr -S -r' to 'setcap -r' and removed attr code
 | |
| #
 | |
| #
 | |
| # the user has the necessary POSIX Capabilities in his Inheritance
 | |
| # set and the applications are accepting the needed PCaps through
 | |
| # their Inheritance set.
 | |
| # a user who has not the PCaps in his Inheritance set CAN NOT
 | |
| # successfully execute the apps
 | |
| # --> SET=ie
 | |
| # (if SET=pe than you relax the security level of your machine)
 | |
| #
 | |
| #
 | |
| #
 | |
| 
 | |
| 
 | |
| ##HERE WE ADD APPS
 | |
| ##################
 | |
| 
 | |
| ## these apps uses their POSIX Caps
 | |
| ###################################
 | |
| # see /usr/include/linux/capability.h
 | |
| # adjust - if needed and wanted - /etc/security/capability.conf
 | |
| #eject=cap_dac_read_search,cap_sys_rawio
 | |
| eject=2,17
 | |
| #killall=cap_kill
 | |
| killall=5
 | |
| #modprobe=cap_sys_module
 | |
| modprobe=16
 | |
| #ntpdate=cap_net_bind_service,cap_sys_time
 | |
| ntpdate=10,25
 | |
| #qemu=cap_net_admin
 | |
| qemu=12
 | |
| #route=cap_net_admin
 | |
| route=12
 | |
| 
 | |
| 
 | |
| # this apps were converted/reverted
 | |
| ###################################
 | |
| APPSARRAY=( eject killall modprobe ntpdate qemu route )
 | |
| 
 | |
| 
 | |
| # we put it into this set
 | |
| #########################
 | |
| SET=ie
 | |
| 
 | |
| 
 | |
| ##FROM HERE ONLY LOGIC
 | |
| ######################
 | |
| 
 | |
| #save assumption!?
 | |
| export PATH=/sbin:/bin:/usr/sbin:/usr/bin/:usr/local/sbin:/usr/local/bin
 | |
| 
 | |
| p4c_test(){
 | |
|     # are we sane?
 | |
|     WICH=`which which 2>/dev/null`
 | |
|     if [ $WICH == "" ]; then
 | |
|         # thats bad
 | |
|         echo "Sorry, I haven't found which"
 | |
|         exit
 | |
|     fi
 | |
| 
 | |
|     # we needt his apps
 | |
|     SETCAP=`which setcap 2>/dev/null`
 | |
|     if [ "$SETCAP" == "" ]; then
 | |
|         echo "Sorry, I'm missing setcap !"
 | |
|         exit
 | |
|     fi
 | |
| 
 | |
|     # checking setcap for SET_SETFCAP PCap ?
 | |
|     # for now we stick to root
 | |
|     if [ "$( id -u )" != "0" ]; then
 | |
|         echo "Sorry, you must be root !"
 | |
|         exit 1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| p4c_app_convert(){
 | |
|     # convert a single app
 | |
|     # $1 is app name; $2 is POSIX Caps
 | |
|     # well symlinks to apps, so we use -a ...
 | |
|     APP=`which -a $1 2>/dev/null`
 | |
|     if [ "$APP" != "" ]; then
 | |
|         FOUND=no
 | |
|         for i in $APP; do
 | |
|             # ... and are looking for symlinks
 | |
|             if [ -f "$i" -a ! -L $i -a "$FOUND"=="no" ]; then
 | |
|                 echo "converting $i"
 | |
|                 setcap $2=$SET $i
 | |
|                 FOUND=yes
 | |
|             fi
 | |
|         done
 | |
|         if [ "$FOUND" == "no" ]; then
 | |
|             # 'which' found only symlinks
 | |
|             echo "1 haven't found $1"
 | |
|         fi
 | |
|     else
 | |
|         # 'which' hasn't anything given back
 | |
|         echo "haven't found $1"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| p4c_app_revert(){
 | |
|     # revert a singel app
 | |
|     # $1 is app name
 | |
|     APP=`which -a $1 2>/dev/null`
 | |
|     if [ "$APP" != "" ]; then
 | |
|         FOUND=no
 | |
|         for i in $APP; do
 | |
|             if [ -f "$i" -a ! -L $i -a "$FOUND"=="no" ]; then
 | |
|                 echo "reverting $i"
 | |
|                 setcap -r $i 2>/dev/null
 | |
|                 FOUND=yes
 | |
|             fi
 | |
|         done
 | |
|         if [ "$FOUND" == "no" ]; then
 | |
|             echo "1 haven't found $1"
 | |
|         fi
 | |
|     else
 | |
|         echo "haven't found $1"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| p4c_convert(){
 | |
|     # we go throug the APPSARRAY and call s2p_app_convert to do the job
 | |
|     COUNTER=0
 | |
|     let UPPER=${#APPSARRAY[*]}-1
 | |
|     until [ $COUNTER == $UPPER ]; do
 | |
|         p4c_app_convert ${APPSARRAY[$COUNTER]} ${!APPSARRAY[$COUNTER]}
 | |
|         let COUNTER+=1
 | |
|     done
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| p4c_revert(){
 | |
|     COUNTER=0
 | |
|     let UPPER=${#APPSARRAY[*]}-1
 | |
|     until [ $COUNTER == $UPPER ]; do
 | |
|         p4c_app_revert ${APPSARRAY[$COUNTER]}
 | |
|         let COUNTER+=1
 | |
|     done
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| p4c_usage(){
 | |
|     echo
 | |
|     echo "pcaps4convenience"
 | |
|     echo
 | |
|     echo "pcaps4convenience stores the needed POSIX Capabilities for binaries to"
 | |
|     echo "run successful into their Inheritance and Effective Set."
 | |
|     echo "The user who wants to execute this binaries successful has to have the"
 | |
|     echo "necessary POSIX Capabilities in his Inheritable Set. This might be done"
 | |
|     echo "through the PAM module pam_cap.so."
 | |
|     echo "A user who has not the needed PCaps in his Inheritance Set CAN NOT execute"
 | |
|     echo "these binaries successful."
 | |
|     echo "(well, still per sudo or su -c - but thats not the point here)"
 | |
|     echo
 | |
|     echo "You need and I will check fot the utilities which and setcap."
 | |
|     echo
 | |
|     echo "Your Filesystem has to support extended attributes and your kernel must have"
 | |
|     echo "support for POSIX File Capabilities (CONFIG_SECURITY_FILE_CAPABILITIES)."
 | |
|     echo
 | |
|     echo "Usage:  pcaps4convenience [con(vert)|rev(ert)|help]"
 | |
|     echo
 | |
|     echo "         con|convert - from setuid0 to POSIX Capabilities"
 | |
|     echo "         rev|revert  - from POSIX Capabilities back to setui0"
 | |
|     echo "         help        - this help message"
 | |
|     echo
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| case "$1" in
 | |
|     con|convert)
 | |
|         p4c_test
 | |
|         p4c_convert
 | |
|         exit 0
 | |
|         ;;
 | |
|     rev|revert)
 | |
|         p4c_test
 | |
|         p4c_revert
 | |
|         exit 0
 | |
|         ;;
 | |
|     help)
 | |
|         p4c_usage
 | |
|         exit 0
 | |
|         ;;
 | |
|     *)
 | |
|         echo "Try 'pcaps4convenience help' for more information"
 | |
|         exit 1
 | |
|         ;;
 | |
| esac
 |