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