[unix] 루트 사용자없이 SSH를 통해 원격 컴퓨터의 모든 파일을 rsync?

원격 컴퓨터를 백업하는이 명령이 있습니다. 문제는 모든 파일을 읽고 복사하려면 루트 권한이 필요하다는 것입니다. 보안상의 이유로 루트 사용자가 활성화되어 있지 않으며 sudoUbuntu 방식을 사용 합니다. 이 작업을하려면 멋진 파이핑이나 무언가가 필요합니까?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/



답변

우선 루트 계정을 사용하는 것이 좋습니다. 다음과 같이 설정 한 경우 :

  • sshd_config대상 머신을로 구성하십시오 PermitRootLogin without-password.
  • ssh-keygenSSH 개인 키를 작성하기 위해 백업을 가져 오는 머신에서 사용하십시오 (SSH 키가없는 경우에만). 암호를 설정하지 마십시오. 구글 튜토리얼에 대한 자세한 내용이 필요하면 충분해야합니다.
  • /root/.ssh/id_rsa.pub백업 머신 의 내용을 /root/.ssh/authorized_keys대상 머신 의 내용에 추가하십시오 .
  • 이제 백업 머신은 비밀번호 인증을 사용할 필요없이 대상 머신에 대한 루트 액세스 권한을 갖습니다.

결과 설정은 꽤 안전해야합니다.


sudo, 특히 NOPASSWD의견에서 권장 하는 대로 결합 하면 루트 계정을 사용하는 것보다 보안상의 이점이 없습니다. 예를 들면 다음과 같습니다.

/etc/sudoers파일에 다음을 추가 하십시오.rsyncuser ALL= NOPASSWD:/usr/bin/rsync

기본적으로 제공 rsyncuser어쨌든 루트 권한을. 물어:

@MartinvonWittich 다음으로 rsync실행 되기 때문에 전체 루트 셸을 쉽게 얻을 수 sudo있습니까? 그 곳을 걸어보세요.

글쎄요, 간단합니다. 권장 구성 을 사용하면 비밀번호를 요구하지 않아도 루트로 rsyncuser실행될 수 rsync있습니다. rsync파일을 조작하는 강력한 도구이므로 이제 rsyncuser루트 권한으로 파일을 조작하는 강력한 도구가 있습니다. 이것을 악용하는 방법을 찾는 데 몇 분 밖에 걸리지 않았습니다 (Ubuntu 13.04에서 테스트되었으며 dash, bash작동하지 않았습니다).

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

보시다시피, 나는 스스로 루트 쉘을 만들었습니다. whoami내 계정을 루트로 식별하고에서 파일을 만들 /etc수 있으며에서 읽을 수 있습니다 /etc/shadow. 내 착취는 바이너리 에 setuid 비트 를 설정하는 것이 었습니다 dash. Linux는 항상 소유자의 권한으로이 바이너리를 실행합니다 (이 경우 root).

진정한 뿌리를 갖는 것은 좋은 이유가 아니라 [권장]이 아닙니다. – redanimalwar 15 시간 전

아니요. 루트 계정을 사용하는 것이 절대적으로 적절한 상황에서 루트 계정을 서투르게 사용하는 것은 좋은 이유가 아닙니다. 이것은 화물 컬트 프로그래밍 의 또 다른 형태입니다. sudo 대 root의 개념을 실제로 이해하지 못하고, 어딘가에서 읽었 기 때문에 “root가 나쁘고 sudo가 좋습니다”라는 신념을 맹목적으로 적용합니다.

한편으로, sudo업무에 꼭 맞는 도구 인 상황이 있습니다 . 예를 들어, 그래픽 리눅스 데스크탑에서 대화식으로 작업 할 때 우분투를 말하면 sudo루트 액세스가 필요한 드문 경우에 사용해야합니다. 우분투는 의도적으로 루트 계정을 비활성화 sudo했으며 사용자가 항상 루트 계정을 사용하여 로그인하지 못하도록 기본적 으로 사용하도록 강요합니다 . 사용자가 웹 브라우저 등을 사용하려는 경우 루트로 로그인하는 것은 위험한 일입니다 따라서 기본적으로 루트 계정이 없으면 바보 같은 사람들이이 작업을 수행 할 수 없습니다.

다른 한편으로, 자동화 된 스크립트가 예를 들어 백업을 만들기 위해 루트 권한을 요구하는 상황이 있습니다. 이제 sudo루트 계정을 해결하기 위해 사용 하는 것은 무의미 할뿐만 아니라 위험합니다. 언뜻 rsyncuser보기에는 일반 권한이없는 계정처럼 보입니다. 그러나 이미 설명했듯이 공격자가 이미 rsyncuser액세스 권한을 얻은 경우 전체 루트 액세스 권한을 얻는 것이 매우 쉽습니다 . 따라서 본질적으로 루트 계정처럼 보이지 않는 추가 루트 계정이 생겼습니다. 이는 좋지 않습니다.


답변

의 사용하십시오 --rsync-path원격 있도록 옵션을 rsync실행 명령 sudo권한을. 그런 다음 명령은 다음과 같아야합니다.

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

경우 sudo암호를 입력하라는 메시지를 표시합니다, 당신이 중 하나를 사용하여 것을 방지하기 위해이 NOPASSWD원격 사용자 계정과 권한 (루트 무의미 다른 사용 사례에서 의미가 있음), 또는 당신은 그렇게하지 않으려면 :

  • 옵션이 있는지 확인 tty_tickets당신은 예를 들어 실행하여 사용하는 사용자에 대한 비활성화 sudo visudo -f /etc/sudoers.d/local-rsync
    및 입주를 :

    Defaults:your.username.for.rsync !tty_tickets
    
  • requiretty사용중인 사용자에 대해 옵션 이 비활성화되어 있는지 확인하십시오 . 기본적으로 꺼져있을 수 있습니다. 방법은 위와 동일합니다.

  • 다음 sudo을 실행하여 원격 시스템 의 비밀번호를
    시드하십시오.ssh -t user@192.168.1.2 sudo


답변

이 작업을 수행하는 간단한 방법 중 하나는와 ssh-askpass함께 그래픽 프로그램 을 사용하는 sudosudo입니다. 터미널에 연결되지 않은 사실 을 극복하고 암호를 안전하게 입력 할 수 있습니다.

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

물론 ssh-askpass프로그램은 주어진 위치에 설치되어 있어야하며 작업중인 컴퓨터에서 X 세션을 실행해야합니다. ssh-askpass프로그램 에는 약간의 변형 이 있으며 작동해야합니다 (Gnome / KDE 버전). 또한 그래픽 sudo교체 프로그램이 작동 gksu하거나 kdesudo작동해야합니다.


답변

사용자가 이미 비밀번호로 보호 된 sudo 권한을 가지고 있다면 그대로 유지하고 비밀번호없이 rsync를 사용하기 위해 스탠자를 추가합니다.

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync


답변

오늘이 문제가 발생하여 구성 파일을 수정하거나 사용자 계정에 루트 수준 권한을 부여 할 필요없이 해결했습니다. 내 특별한 설정 A은 컴퓨터 foo의 사용자 가 사용자가 소유 한 디렉토리의 모든 사용자 디렉토리 foo를 컴퓨터 로 복사해야 한다는 것 입니다. (사용자 에게는에 대한 sudo 권한이 있습니다 .)barbackupAAfoo

내가 사용한 명령은 다음과 같습니다. A/home디렉토리에서 사용자가 호출했습니다 foo.

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

이것은 rsync를 sudo로 실행하여 모든 사용자 디렉토리에 foo액세스 할 수 있지만 rsync에게 ssh를 bar사용하여 사용자 A의 자격 증명을 사용하여 시스템에 액세스하도록 지시 합니다. 내 요구 사항은 위의 질문과 약간 달랐지만 시스템 구성을 조정하지 않고 관리하는 특정 컴퓨터의 모든 사용자 디렉토리를 신속하게 백업 할 수있었습니다.


답변

대상 시스템에서 데몬으로 rsync를 실행하면 원하는 작업을 수행 할 수 있습니다.


답변

내 해결책은 사용하는 --rsync-path="sudo rsync"것이지만 암호를 묻는 해결책입니다.

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .