370 lines
9.6 KiB
Bash
370 lines
9.6 KiB
Bash
#!/bin/sh
|
|
# vim: tabstop=4
|
|
#
|
|
# author: chris friedhoff - chris@friedhoff.org
|
|
# version: pcaps4server 5 Tue Mar 11 2008
|
|
#
|
|
#
|
|
# changelog:
|
|
# 1 - initial release pcaps4convenience
|
|
# 1 - 2007.02.15 - initial release
|
|
# 2 - 2007.11.02 - changed to new setfcaps api; each app is now callable; supressed error of id
|
|
# 3 - 2007.12.28 - changed to libcap2 package setcap/getcap
|
|
# 4 - renamed to pcaps4server
|
|
# removed suid0 and convenience files,
|
|
# they are now in pcaps4suid0 resp. pcaps4convenience
|
|
# 5 - changed 'attr -S -r' to 'setcap -r' and removed attr code
|
|
#
|
|
#
|
|
###########################################################################
|
|
# change the installation of different server to be able not to run as root
|
|
# and have their own unpriviledged user. The binary has the needed POSIX
|
|
# Capabilities.
|
|
# to ensure that the server is really started as his respective user, we set
|
|
# the suid bit (BUT NOT 0)!
|
|
# paths are hard coded and derive from a slackware system
|
|
# change it to your needs !!
|
|
###########################################################################
|
|
|
|
|
|
|
|
VERBOSE="-v"
|
|
#VERBOSE=""
|
|
APPS=""
|
|
|
|
message(){
|
|
printRedMessage "$1"
|
|
}
|
|
|
|
printRedMessage(){
|
|
# print message red and turn back to white
|
|
echo -e "\n\033[00;31m $1 ...\033[00;00m\n"
|
|
}
|
|
|
|
printGreenMessage(){
|
|
# print message red and turn back to white
|
|
echo -e "\033[00;32m $1 ...\033[00;00m\n"
|
|
sleep 0.5
|
|
}
|
|
|
|
checkReturnCode(){
|
|
if [ "$?" != "0" ]; then
|
|
printRedMessage "!! I'M HAVING A PROBLEM !! THE RETURNCODE IS NOT 0 !! I STOP HERE !!"
|
|
exit 1
|
|
else
|
|
printGreenMessage ":-)"
|
|
sleep 0.5
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
p4r_test(){
|
|
#for now, we work with root
|
|
if [ "$( id -u )" != "0" ]; then
|
|
echo "Sorry, you must be root !"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
|
|
# apache 1.3
|
|
########
|
|
#APPS="$APPS apache1"
|
|
apache1_convert(){
|
|
message "converting apache1"
|
|
if [ "$( id -g apache 2>/dev/null )" == "" ]; then
|
|
groupadd -g 60 apache
|
|
fi
|
|
if [ "$( id -u apache 2>/dev/null )" == "" ]; then
|
|
useradd -g apache -d / -u 600 apache
|
|
fi
|
|
sed -i -e "{s|^\(User\).*|\1 apache|; s|^\(Group\) .*|\1 apache|}" /etc/apache/httpd.conf
|
|
chown $VERBOSE -R apache:apache /var/run/apache/
|
|
chown $VERBOSE -R apache:apache /etc/apache/
|
|
chown $VERBOSE -R apache:apache /var/log/apache/
|
|
chown $VERBOSE apache:apache /usr/sbin/httpd
|
|
chmod $VERBOSE u+s /usr/sbin/httpd
|
|
setcap cap_net_bind_service=ep /usr/sbin/httpd
|
|
checkReturnCode
|
|
}
|
|
apache1_revert(){
|
|
message "reverting apache1"
|
|
chown $VERBOSE -R root:root /var/run/apache/
|
|
chown $VERBOSE -R root:root /etc/apache/
|
|
chown $VERBOSE -R root:root /var/log/apache/
|
|
chown $VERBOSE root:root /usr/sbin/httpd
|
|
chmod $VERBOSE u-s /usr/sbin/httpd
|
|
setcap -r /usr/sbin/httpd
|
|
checkReturnCode
|
|
sed -i -e "{s|^\(User\).*|\1 nobody|; s|^\(Group\).*|\1 nogroup|}" /etc/apache/httpd.conf
|
|
userdel apache
|
|
groupdel apache
|
|
}
|
|
|
|
|
|
# apache 2.x
|
|
########
|
|
APPS="$APPS apache2"
|
|
apache2_convert(){
|
|
message "converting apache2"
|
|
if [ "$( id -g apache 2>/dev/null )" == "" ]; then
|
|
groupadd -g 60 apache
|
|
fi
|
|
if [ "$( id -u apache 2>/dev/null )" == "" ]; then
|
|
useradd -g apache -d / -u 600 apache
|
|
fi
|
|
sed -i -e "{s|^\(User\).*|\1 apache|; s|^\(Group\) .*|\1 apache|}" /etc/httpd/httpd.conf
|
|
chown $VERBOSE -R apache:apache /var/run/httpd/
|
|
chown $VERBOSE -R apache:apache /etc/httpd/
|
|
chown $VERBOSE -R apache:apache /var/log/httpd/
|
|
chown $VERBOSE apache:apache /usr/sbin/httpd
|
|
chmod $VERBOSE u+s /usr/sbin/httpd
|
|
#setfcaps -c cap_net_bind_service=p -e /usr/sbin/httpd
|
|
setcap cap_net_bind_service=ep /usr/sbin/httpd
|
|
checkReturnCode
|
|
}
|
|
apache2_revert(){
|
|
message "reverting apache2"
|
|
chown $VERBOSE -R root:root /var/run/httpd/
|
|
chown $VERBOSE -R root:root /etc/httpd/
|
|
chown $VERBOSE -R root:root /var/log/httpd/
|
|
chown $VERBOSE root:root /usr/sbin/httpd
|
|
chmod $VERBOSE u-s /usr/sbin/httpd
|
|
setcap -r /usr/sbin/httpd
|
|
checkReturnCode
|
|
sed -i -e "{s|^\(User\).*|\1 nobody|; s|^\(Group\).*|\1 nogroup|}" /etc/httpd/httpd.conf
|
|
userdel apache
|
|
groupdel apache
|
|
}
|
|
|
|
|
|
# samba
|
|
#######
|
|
APPS="$APPS samba"
|
|
samba_convert(){
|
|
message "converting samba"
|
|
if [ "$( id -g samba 2>/dev/null )" == "" ]; then
|
|
groupadd -g 61 samba
|
|
fi
|
|
if [ "$( id -u samba 2>/dev/null )" == "" ]; then
|
|
useradd -g samba -d / -u 610 samba
|
|
fi
|
|
chown $VERBOSE -R samba:samba /var/log/samba
|
|
chown $VERBOSE -R samba:samba /etc/samba
|
|
chown $VERBOSE -R samba:samba /var/run/samba
|
|
chown $VERBOSE -R samba:samba /var/cache/samba
|
|
chown $VERBOSE samba:samba /usr/sbin/smbd /usr/sbin/nmbd
|
|
chmod $VERBOSE u+s /usr/sbin/smbd /usr/sbin/nmbd
|
|
setcap cap_net_bind_service,cap_sys_resource,cap_dac_override=ep /usr/sbin/smbd
|
|
checkReturnCode
|
|
setcap cap_net_bind_service=ep /usr/sbin/nmbd
|
|
checkReturnCode
|
|
}
|
|
|
|
samba_revert(){
|
|
message "reverting samba"
|
|
chown $VERBOSE -R root:root /var/log/samba
|
|
chown $VERBOSE -R root:root /etc/samba
|
|
chown $VERBOSE -R root:root /var/run/samba
|
|
chown $VERBOSE -R root:root /var/cache/samba
|
|
chown $VERBOSE root:root /usr/sbin/smbd /usr/sbin/nmbd
|
|
chmod $VERBOSE u-s /usr/sbin/smbd /usr/sbin/nmbd
|
|
setcap -r /usr/sbin/smbd
|
|
checkReturnCode
|
|
setcap -r /usr/sbin/nmbd
|
|
checkReturnCode
|
|
userdel samba
|
|
groupdel samba
|
|
}
|
|
|
|
|
|
# bind
|
|
######
|
|
APPS="$APPS bind"
|
|
bind_convert(){
|
|
message "converting bind"
|
|
if [ "$( id -g bind 2>/dev/null )" == "" ]; then
|
|
groupadd -g 62 bind
|
|
fi
|
|
if [ "$( id -u bind 2>/dev/null )" == "" ]; then
|
|
useradd -g bind -d / -u 620 bind
|
|
fi
|
|
chown $VERBOSE -R bind:bind /var/run/named
|
|
chown $VERBOSE -R bind:bind /var/named
|
|
chown $VERBOSE bind:bind /etc/rndc.key
|
|
chown $VERBOSE bind:bind /usr/sbin/named
|
|
chmod $VERBOSE u+s /usr/sbin/named
|
|
setcap cap_net_bind_service=ep /usr/sbin/named
|
|
checkReturnCode
|
|
}
|
|
bind_revert(){
|
|
message "reverting bind"
|
|
chown $VERBOSE -R root:root /var/run/named
|
|
chown $VERBOSE -R root:root /var/named
|
|
chown $VERBOSE root:root /etc/rndc.key
|
|
chown $VERBOSE root:root /usr/sbin/named
|
|
chmod $VERBOSE u-s /usr/sbin/named
|
|
setcap -r /usr/sbin/named
|
|
checkReturnCode
|
|
userdel bind
|
|
groupdel bind
|
|
}
|
|
|
|
|
|
# dhcpd
|
|
#######
|
|
APPS="$APPS dhcpd"
|
|
dhcpd_convert(){
|
|
message "converting dhcpd"
|
|
if [ "$( id -g dhcpd 2>/dev/null )" == "" ]; then
|
|
groupadd -g 63 dhcpd
|
|
fi
|
|
if [ "$( id -u dhcpd 2>/dev/null )" == "" ]; then
|
|
useradd -g dhcpd -d / -u 630 dhcpd
|
|
fi
|
|
chown $VERBOSE dhcpd:dhcpd /var/run/dhcpd
|
|
chown $VERBOSE dhcpd:dhcpd /etc/dhcpd.conf
|
|
chown $VERBOSE -R dhcpd:dhcpd /var/state/dhcp/
|
|
chown $VERBOSE dhcpd:dhcpd /usr/sbin/dhcpd
|
|
chmod $VERBOSE u+s /usr/sbin/dhcpd
|
|
setcap cap_net_bind_service,cap_net_raw=ep /usr/sbin/dhcpd
|
|
checkReturnCode
|
|
}
|
|
dhcpd_revert(){
|
|
message "reverting dhcpd"
|
|
chown $VERBOSE root:root /var/run/dhcpd
|
|
chown $VERBOSE root:root /etc/dhcpd.conf
|
|
chown $VERBOSE -R root:root /var/state/dhcp/
|
|
chown $VERBOSE root:root /usr/sbin/dhcpd
|
|
chmod $VERBOSE u-s /usr/sbin/dhcpd
|
|
setcap -r /usr/sbin/dhcpd
|
|
checkReturnCode
|
|
userdel dhcpd
|
|
groupdel dhcpd
|
|
}
|
|
|
|
|
|
# cupsd
|
|
#######
|
|
APPS="$APPS cupsd"
|
|
cupsd_convert(){
|
|
message "converting cupsd"
|
|
if [ "$( id -g cupsd 2>/dev/null )" == "" ]; then
|
|
groupadd -g 64 cupsd
|
|
fi
|
|
if [ "$( id -u cupsd 2>/dev/null )" == "" ]; then
|
|
useradd -g cupsd -d / -u 640 cupsd
|
|
fi
|
|
sed -i -e "{s|^\(User\).*|\1 cupsd|; s|^\(Group\) .*|\1 cupsd|}" /etc/cups/cupsd.conf
|
|
chown $VERBOSE -R cupsd:cupsd /etc/cups
|
|
chown $VERBOSE -R cupsd:cupsd /var/cache/cups
|
|
chown $VERBOSE -R cupsd:cupsd /var/log/cups
|
|
chown $VERBOSE -R cupsd:cupsd /var/spool/cups
|
|
chown $VERBOSE -R cupsd:cupsd /var/run/cups
|
|
chown $VERBOSE cupsd:cupsd /usr/sbin/cupsd
|
|
chmod $VERBOSE u+s /usr/sbin/cupsd
|
|
setcap cap_net_bind_service,cap_dac_read_search=ep /usr/sbin/cupsd
|
|
checkReturnCode
|
|
}
|
|
cupsd_revert(){
|
|
message "reverting cupsd"
|
|
chown $VERBOSE -R root:root /etc/cups
|
|
chown $VERBOSE -R root:lp /var/cache/cups
|
|
chown $VERBOSE -R root:root /var/log/cups
|
|
chown $VERBOSE -R root:root /var/spool/cups
|
|
chown $VERBOSE root:lp /var/run/cups
|
|
chown $VERBOSE lp:sys /var/run/cups/certs
|
|
chmod $VERBOSE 750 /var/run/cups/certs
|
|
chown $VERBOSE root:root /usr/sbin/cupsd
|
|
chmod $VERBOSE u-s /usr/sbin/cupsd
|
|
setcap -r /usr/sbin/cupsd
|
|
checkReturnCode
|
|
sed -i -e "{s|^\(User\).*|\1 lp|; s|^\(Group\) .*|\1 sys|}" /etc/cups/cupsd.conf
|
|
userdel cupsd
|
|
groupdel cupsd
|
|
}
|
|
|
|
|
|
usage_message(){
|
|
echo "Try 'pcaps4server help' for more information"
|
|
}
|
|
|
|
|
|
p4r_usage(){
|
|
echo
|
|
echo "pcaps4server"
|
|
echo
|
|
echo "pcaps4server stores the needed POSIX Capabilities for server binaries to"
|
|
echo "run successful into their Permitted and Effective Set."
|
|
echo "The server are now able to run as an unpriviledged user."
|
|
echo "For each server software an unpriviledged user is added the system."
|
|
echo "The ownership of all the respective paths are changed to this user."
|
|
echo "To ensure that the server is starting as this unpriviledgesd user, the"
|
|
echo "suid bit (NOT 0) is set."
|
|
echo "Effectively this means every user can start this server daemons (for now)."
|
|
echo "All paths are hard coded!"
|
|
echo "You have been warned. Enjoy!"
|
|
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: pcaps4server [PROG] [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
|
|
echo " PROG: $APPS"
|
|
echo
|
|
}
|
|
|
|
|
|
|
|
|
|
case "$1" in
|
|
con|convert)
|
|
p4r_test
|
|
for j in $APPS; do
|
|
${j}_convert
|
|
done
|
|
exit
|
|
;;
|
|
rev|renvert)
|
|
p4r_test
|
|
for j in $APPS; do
|
|
${j}_revert
|
|
done
|
|
exit
|
|
;;
|
|
help)
|
|
p4r_usage
|
|
exit
|
|
;;
|
|
esac
|
|
|
|
for i in ${APPS}; do
|
|
if [ "$1" == "$i" ]; then
|
|
case "$2" in
|
|
con|convert)
|
|
p4r_test
|
|
${i}_convert
|
|
exit
|
|
;;
|
|
rev|revert)
|
|
p4r_test
|
|
${i}_revert
|
|
exit
|
|
;;
|
|
*)
|
|
usage_message
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
done
|
|
|
|
usage_message
|