Blame contrib/pcaps4server

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