Home | History | Annotate | Download | only in contrib
      1 #!/bin/bash
      2 # vim:expandtab:tabstop=4
      3 #
      4 # author:    chris friedhoff - chris (at] friedhoff.org
      5 # version:   pcaps4convenience  2  Tue Mar 11 2008
      6 #
      7 #
      8 # changelog:
      9 # 1 - initial release pcaps4convenience
     10 # 2 - changed 'attr -S -r' to 'setcap -r' and removed attr code
     11 #
     12 #
     13 # the user has the necessary POSIX Capabilities in his Inheritance
     14 # set and the applications are accepting the needed PCaps through
     15 # their Inheritance set.
     16 # a user who has not the PCaps in his Inheritance set CAN NOT
     17 # successfully execute the apps
     18 # --> SET=ie
     19 # (if SET=pe than you relax the security level of your machine)
     20 #
     21 #
     22 #
     23 
     24 
     25 ##HERE WE ADD APPS
     26 ##################
     27 
     28 ## these apps uses their POSIX Caps
     29 ###################################
     30 # see /usr/include/linux/capability.h
     31 # adjust - if needed and wanted - /etc/security/capability.conf
     32 #eject=cap_dac_read_search,cap_sys_rawio
     33 eject=2,17
     34 #killall=cap_kill
     35 killall=5
     36 #modprobe=cap_sys_module
     37 modprobe=16
     38 #ntpdate=cap_net_bind_service,cap_sys_time
     39 ntpdate=10,25
     40 #qemu=cap_net_admin
     41 qemu=12
     42 #route=cap_net_admin
     43 route=12
     44 
     45 
     46 # this apps were converted/reverted
     47 ###################################
     48 APPSARRAY=( eject killall modprobe ntpdate qemu route )
     49 
     50 
     51 # we put it into this set
     52 #########################
     53 SET=ie
     54 
     55 
     56 ##FROM HERE ONLY LOGIC
     57 ######################
     58 
     59 #save assumption!?
     60 export PATH=/sbin:/bin:/usr/sbin:/usr/bin/:usr/local/sbin:/usr/local/bin
     61 
     62 p4c_test(){
     63     # are we sane?
     64     WICH=`which which 2>/dev/null`
     65     if [ $WICH == "" ]; then
     66         # thats bad
     67         echo "Sorry, I haven't found which"
     68         exit
     69     fi
     70 
     71     # we needt his apps
     72     SETCAP=`which setcap 2>/dev/null`
     73     if [ "$SETCAP" == "" ]; then
     74         echo "Sorry, I'm missing setcap !"
     75         exit
     76     fi
     77 
     78     # checking setcap for SET_SETFCAP PCap ?
     79     # for now we stick to root
     80     if [ "$( id -u )" != "0" ]; then
     81         echo "Sorry, you must be root !"
     82         exit 1
     83     fi
     84 }
     85 
     86 
     87 
     88 p4c_app_convert(){
     89     # convert a single app
     90     # $1 is app name; $2 is POSIX Caps
     91     # well symlinks to apps, so we use -a ...
     92     APP=`which -a $1 2>/dev/null`
     93     if [ "$APP" != "" ]; then
     94         FOUND=no
     95         for i in $APP; do
     96             # ... and are looking for symlinks
     97             if [ -f "$i" -a ! -L $i -a "$FOUND"=="no" ]; then
     98                 echo "converting $i"
     99                 setcap $2=$SET $i
    100                 FOUND=yes
    101             fi
    102         done
    103         if [ "$FOUND" == "no" ]; then
    104             # 'which' found only symlinks
    105             echo "1 haven't found $1"
    106         fi
    107     else
    108         # 'which' hasn't anything given back
    109         echo "haven't found $1"
    110     fi
    111 }
    112 
    113 
    114 
    115 p4c_app_revert(){
    116     # revert a singel app
    117     # $1 is app name
    118     APP=`which -a $1 2>/dev/null`
    119     if [ "$APP" != "" ]; then
    120         FOUND=no
    121         for i in $APP; do
    122             if [ -f "$i" -a ! -L $i -a "$FOUND"=="no" ]; then
    123                 echo "reverting $i"
    124                 setcap -r $i 2>/dev/null
    125                 FOUND=yes
    126             fi
    127         done
    128         if [ "$FOUND" == "no" ]; then
    129             echo "1 haven't found $1"
    130         fi
    131     else
    132         echo "haven't found $1"
    133     fi
    134 }
    135 
    136 
    137 
    138 p4c_convert(){
    139     # we go throug the APPSARRAY and call s2p_app_convert to do the job
    140     COUNTER=0
    141     let UPPER=${#APPSARRAY[*]}-1
    142     until [ $COUNTER == $UPPER ]; do
    143         p4c_app_convert ${APPSARRAY[$COUNTER]} ${!APPSARRAY[$COUNTER]}
    144         let COUNTER+=1
    145     done
    146 }
    147 
    148 
    149 
    150 p4c_revert(){
    151     COUNTER=0
    152     let UPPER=${#APPSARRAY[*]}-1
    153     until [ $COUNTER == $UPPER ]; do
    154         p4c_app_revert ${APPSARRAY[$COUNTER]}
    155         let COUNTER+=1
    156     done
    157 
    158 }
    159 
    160 
    161 
    162 p4c_usage(){
    163     echo
    164     echo "pcaps4convenience"
    165     echo
    166     echo "pcaps4convenience stores the needed POSIX Capabilities for binaries to"
    167     echo "run successful into their Inheritance and Effective Set."
    168     echo "The user who wants to execute this binaries successful has to have the"
    169     echo "necessary POSIX Capabilities in his Inheritable Set. This might be done"
    170     echo "through the PAM module pam_cap.so."
    171     echo "A user who has not the needed PCaps in his Inheritance Set CAN NOT execute"
    172     echo "these binaries successful."
    173     echo "(well, still per sudo or su -c - but thats not the point here)"
    174     echo
    175     echo "You need and I will check fot the utilities which and setcap."
    176     echo
    177     echo "Your Filesystem has to support extended attributes and your kernel must have"
    178     echo "support for POSIX File Capabilities (CONFIG_SECURITY_FILE_CAPABILITIES)."
    179     echo
    180     echo "Usage:  pcaps4convenience [con(vert)|rev(ert)|help]"
    181     echo
    182     echo "         con|convert - from setuid0 to POSIX Capabilities"
    183     echo "         rev|revert  - from POSIX Capabilities back to setui0"
    184     echo "         help        - this help message"
    185     echo
    186 }
    187 
    188 
    189 
    190 case "$1" in
    191     con|convert)
    192         p4c_test
    193         p4c_convert
    194         exit 0
    195         ;;
    196     rev|revert)
    197         p4c_test
    198         p4c_revert
    199         exit 0
    200         ;;
    201     help)
    202         p4c_usage
    203         exit 0
    204         ;;
    205     *)
    206         echo "Try 'pcaps4convenience help' for more information"
    207         exit 1
    208         ;;
    209 esac
    210