Statt einem Programm über das SETUID-Bit alle Systemrechte zu geben, ist es sinnvoller, nur die Fähigkeiten (capabilities) zu geben, die das Programm zur Erfüllung seines Zwecks benötigt. Das setzt allerdings die Unterstützung des Kernels voraus, welches bestimmte Capabilities bereitstellt, die dann den Programmen gegeben werden können.
Mittels man capabilities
kann man die vom verwendeten Kernel angebotenen Capabilities auflisten.
cat /usr/bin/ping > PING ./PING 9.9.9.9
als root
setcap cap_net_raw=p ./PING getcap ./PING
als user
./PING 9.9.9.9
Unter Debian nicht update-fest:
Moderne Kernel (oder eine andere black magick) erlauben
ping
auch ohne Capabilities.
sysctl -a | grep ping
setcap cap_net_raw,cap_net_admin=pe /usr/sbin/tcpdump
Danach kann jeder User tcpdump benutzen
capsh
startet eine neue Shell mit veränderten Capabilities.
capsh --drop=cap_chown,cap_net_raw -- chown kurt /etc/passwd ping 9.9.9.9
Pakete: libcap-ng-utils
pscap getpcap <pid>
grep ^Cap /proc/<pid>/status CapInh: 0000000000000000 CapPrm: 000001ffffffdffe CapEff: 000001ffffffdffe CapBnd: 000001ffffffdffe CapAmb: 0000000000000000 capsh --decode=000001ffffffdffe
zu sichernder Server:
apt install rsync acl libcap2-bin useradd -r -d /srv/rosync -s /usr/bin/sh rosync install -d -o rosync -g rosync -m 700 /srv/rosync/.ssh install -o rosync -g rosync -m 600 /dev/null /srv rosync/.ssh/authorized_keys
cp /usr/bin/rsync /usr/local/sbin/rsync-for-backup chown root:root /usr/local/sbin/rsync-for-backup chmod 700 /usr/local/sbin/rsync-for-backup setfacl -m user:rosync:rx /usr/local/sbin/rsync-for-backup setcap cap_dac_read_search+ep /usr/local/sbin/rsync-for-backup
TODO: include rrsync?
pull initierender Server:
apt install rsync ssh-keygen -N '' -f .ssh/id_ed25519_rosync -C 'rosync backup' ssh root@otherserver 'cat > /srv/rosync/.ssh/authorized_keys' < .ssh/id_ed25519_rosync.pub rsync -ax -e 'ssh -i .ssh/id_ed25519_rosync' --rsync-path=/usr/local/sbin/rsync-for-backup rosync@192.168.122.74:/ backup
Was nicht gehen sollte:
rsync -ax -e 'ssh -i .ssh/id_ed25519_rosync' --rsync-path=/usr/local/sbin/rsync-for-backup /etc/passwd rosync@192.168.122.74:/srv
systemctl show <unit> | grep -i cap