| #!/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 |