apt-get install --no-install-recommends apache2 ssl-cert backuppc libfile-rsyncp-perl
The backuppc package in Precise triggers some Perl warning:
* Starting backuppc... Use of qw(...) as parentheses is deprecated at /usr/share/backuppc/lib/BackupPC/Storage/Text.pm line 302. Use of qw(...) as parentheses is deprecated at /usr/share/backuppc/lib/BackupPC/Lib.pm line 1425.
Until LP #1119628 is addressed, you can simply run this sed command to fix the warnings:
sed -i 's/\(^[[:space:]]\+foreach my \$param\) \(qw(BackupFilesOnly BackupFilesExclude)\) {$/\1 (\2) {/' /usr/share/backuppc/lib/BackupPC/Lib.pm /usr/share/backuppc/lib/BackupPC/Storage/Text.pmor apply the following patches:
Since this service is rarely accessed via HTTP/HTTPS it is best to have the Web server offline and start it when needed:
update-rc.d -f apache2 remove
Optionally, you can remove some unused modules but be careful if there are other vhosts on your server:
a2dismod access_compat authz_groupfile autoindex autoindex cgid deflate env filter negotiation status > /dev/null
It is also desirable to only access the service via HTTPS to avoid transmitting credentials in the clear:
a2dissite 000-default a2ensite default-ssl a2enmod ssl # Force SSL sed -i 's/^\([[:space:]]*\)#SSLRequireSSL/\1SSLRequireSSL/' /etc/backuppc/apache.conf # Restrict access to VPN IPs only sed -i 's/\(Allow from all\)/#\1\n\t# Only allow VPN\n\tRequire ip 172.31.0.0\/16\n\tRequire ip 2607:f2c0:f00e:794c::\/64/' /etc/backuppc/apache.conf # Correct a packaging issue ln -s /etc/backuppc/apache.conf /etc/apache2/conf-enabled/backuppc.conf apache2ctl -S && service apache2 restart
# SSH mkdir -m 0700 ~backup/.ssh cat << EOF >> ~backup/.ssh/authorized_keys command="/usr/local/bin/backuppc-wrapper",from="172.24.30.64,2607:f2c0:f00e:794a::64",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC5gjBiK5uXBrg+pzGmKLrIIYdjUhP2SVcjaLb6u/fD9czM7tnshUYQfTF7YZkDRQ5oHIlvekJg8vxGeTXnXub/5jVYdbGaTD8vFpuZg+a8egzaamLGSTwlAJka3otgHtekyaroztkxKhfOTou0c0nYcgI7kTUwQIFWe7/bBoCNy+7azGL8bHenVG6YWuuvFwe1nOpUzgPLeYuN3fcrvJP5r2nHPu7wOHsjerhO/tbaRoPOy5ffLhlfAof+tqunpgccWHCy6YnXMCAWrsg+Hn29IMIQhk99tHmYmkzBHBjTdVk4YQT012zCi/LbBk5rF0rUKrRdsluj4rzq0jEGBlWvJhza+Lkz6Q0ynw07K6E5pBgsYSk85tkiPbf0UK5WVvOKhI3znzN1Dp9P4TO1q5JXGFkEBUeyafArMUBcU7//GIKMQrTH9MQIjPVJ/YPq3/QLujXPSEjuSuM8Jz/tQ6yx1pccHgypB9mtfUDARVBCINDdqyuQKV+MpUBqny9tpZYbWJiwi/cYkDTNpNPazd8QLjRep/QKN/wj62e5yQ1SpQMxmTYxPYURBSythUIowtOvZx+1hkrzSD69RBslQCBamEq06bSwNwHsTBJFBkTHhlwc/Fyab8xEULhtPGsqNNpp7TTDw9GDaIXO7NZE3TNWdt/WJh2qDLMzKxMq7hBYrw== bck BackupPC EOF chown backup: -R ~backup/.ssh # Delete old key sed -i '/^command=.*Ocelot BackupPC$/d' ~backup/.ssh/authorized_keys # Sudo cat << "EOF" > /etc/sudoers.d/backuppc # read only access authorized backup ALL = (root) NOPASSWD: /usr/bin/rsync --server --sender -* . /* EOF chmod 0440 /etc/sudoers.d/backuppc # Limits printf "backup\t-\tpriority\t10\n" > /etc/security/limits.d/backup.conf # BackupPC wrapper cat << "EOF" > /usr/local/bin/backuppc-wrapper #!/bin/sh # Explicitly set the PATH to that of ENV_SUPATH in /etc/login.defs and unset # various other variables. For details, see: # https://wiki.ubuntu.com/SecurityTeam/AppArmorPolicyReview#Execute_rules export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export ENV= export CDPATH= LOGGER="/usr/bin/logger" RSYNC="/usr/bin/rsync" SUDO="/usr/bin/sudo" KILL="/bin/kill" LOGGER_CALL="$LOGGER -t $(basename $0)" illegal_command() { # Do not log SSH_ORIGINAL_COMMAND for security reasons $LOGGER_CALL "illegal command denied" # Default deny $KILL -9 $PPID exit 0 } check_rsync_command() { if [ "$#" -lt 6 ]; then # not in the form of /usr/bin/rsync --server --sender -* . /* illegal_command fi if [ "$1" != "rsync" ] && [ "$1" != "$RSYNC" ]; then # not invoking rsync illegal_command else # Remove the 1st arg with later replace it with the # fully qualified path to rsync shift fi if [ "$1" != "--server" ] && [ "$2" != "--sender" ]; then # not read only illegal_command fi # Use an exclude list if one is available if [ -r "${HOME}/exclude.list" ]; then EXCLUDE="--filter=\"merge,-/ ${HOME}/exclude.list\"" else EXCLUDE="" fi $LOGGER_CALL "transfer start" # Remove first 2 known args and pass any exclude file shift 2 eval $SUDO $RSYNC --server --sender "$EXCLUDE" "$@" $LOGGER_CALL "transfer stop" } if [ -z "$SSH_ORIGINAL_COMMAND" ]; then illegal_command fi case "$SSH_ORIGINAL_COMMAND" in *\&*) illegal_command ;; *\(*) illegal_command ;; *\{*) illegal_command ;; *\;*) illegal_command ;; *\>*) illegal_command ;; *\`*) illegal_command ;; *\|*) illegal_command ;; $RSYNC\ --server\ --sender\ -*\ .\ /*) # short path to rsync binary check_rsync_command $SSH_ORIGINAL_COMMAND ;; rsync\ --server\ --sender\ -*\ .\ /*) # short path to rsync binary check_rsync_command $SSH_ORIGINAL_COMMAND ;; *) illegal_command ;; esac EOF chmod 0755 /usr/local/bin/backuppc-wrapper