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


68

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

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

3
root먼저 계정을 사용하십시오 . sudo, 특히 NOPASSWD의견에서 권장 하는 것과 결합하여 실제로 컴퓨터의 보안을 향상 시키지는 않습니다.
Martin von Wittich

답변:


88

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

  • 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액세스 권한을 얻은 경우 전체 루트 액세스 권한을 얻는 것이 매우 쉽습니다 . 따라서 본질적으로 루트 계정처럼 보이지 않는 추가 루트 계정이 생겼습니다. 이는 좋지 않습니다.


2
좋은 설명입니다. 여러 사람이 서버에서 sysadmin 역할을하는 상황에서 루트를 통해 sudo를 사용하는 또 다른 이유가 있습니까? 이 방법으로 루트의 SSH 키를 공유하는 대신 각자 SSH 키를 사용할 수 있습니까?
Nathan S. Watson-Haigh

2
@ NathanS.Watson - 헤이그 당신은 쉽게로 모든 SSH 키를 넣을 수 /root/.ssh/authorized_keys있도록 각 사용자가 자신의 쉘, 가정 및있을 수있는 다른 가정에 여러 루트 계정을 만들 짝수 또는 .ssh/authorized_keys:)
마틴 폰 WITTICH

2
ssh 키를 특정 명령 만 허용하도록 제한 할 수 있습니다. 무언가를 자동화하는 경우 암호 문구 없이이 ssh 키를 만들거나 적어도 기계가 실행될 때마다 액세스 할 수 있기 때문에 확실히 좋은 생각입니다. (해당 머신의 루트가 다른 머신의 루트에 액세스 할 수 있음을 의미합니다.)
Peter Cordes

2
sudo root 사용에 대한 Martin의 우려는 유효하지만 sudoers 파일에서 정확한 rsync 매개 변수를 지정하면 완화 할 수 있습니다. Ubuntu의 sudoers (5) 매뉴얼 페이지에 따르면 "Cmnd에 명령 줄 인수가 연결되어 있으면 Cmnd의 인수가 명령 줄에서 사용자가 제공 한 인수와 정확히 일치해야합니다 (또는 와일드 카드가있는 경우 와일드 카드와 일치해야 함). " sudoers 파일이 정확한 옵션 (소스 및 대상 포함)으로 정확한 rsync 명령을 지정하면 안전해야합니다.

4
한 가지 고려해야 할 사항은 sshd일반적으로 계정에 연결하는 데 사용 된 인증 된 키를 기록 하지 않기 때문에 bob그때 sudo와 같이 연결하면 의 키로 root직접 연결하는 것보다 더 나은 감사 추적을 얻는 것 bob입니다.
Coderer

71

의 사용하십시오 --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


1
요청 된 암호가 가장 가능성이있다 @scai sudo비밀 아닌 ssh비밀
umläute

2
@redanimalwar를 사용 sudo /usr/bin/rsync하면 암호를 묻지 않고 사용자가 할 수 있습니다 . man sudoers이를 수행하는 방법을 확인하십시오 . 이를 위해 추가 백업 사용자를 생성 할 수 있습니다.
umläute

5
허용하려면 sudo /usr/bin/rsync암호가 당신에 다음을 추가로 할 필요없이 실행 /etc/sudoers파일 : rsyncuser ALL= NOPASSWD:/usr/bin/rsync원하는 사용자 이름 (이 전용 백업 사용자를 생성하는 가장 좋은 것입니다 위에서 언급 한 바와 같이)이 사용자 rsyncuser을 수 있습니다.
M_dk

4
@M_dk는 이제 rsync기본적으로 항상 루트 권한을 갖습니다. 해당 계정에서 전체 루트 셸을 얻는 것이 매우 쉽습니다. 처음에는 실제 루트 계정을 사용하는 것이 좋습니다.
Martin von Wittich

1
echo "password" | something내가 결코 말하지 않은 대답은 실제로 이것을 사용하지 않았으며 rsync (여기서는 제안되지 않음)의 sudoless 실행이 나쁘게 만드는 보안 문제에 동의합니다. (가) 무엇 tty_tickets내가 실제로 아무 생각하지, 필요 보인다 보안 문제. 이것은 ssh에서 sodo를 실행 한 다음 명령을 올바르게 실행하여 아무것도 조정하지 않고 안전하게 작동합니까? 그러나 스크립팅 목적으로 그 질문을 했으므로 pw가없는 키 기반 ssh가 안전하고 옳은 일이라는 데 전적으로 동의합니다. 대신 Martins의 답변을 수락했습니다.
redanimalwar

17

이 작업을 수행하는 간단한 방법 중 하나는와 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작동해야합니다.


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .작동하지 않습니다. rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. 아, 우분투는 gnome-ssh-askpass를 제공하지만 /usr/bin/ssh-askpass대신에입니다 /usr/lib/ssh/x11.... 그래서 작동했습니다 :)
Peter Cordes

1
이것은 다른 쪽의 재구성이 필요하지 않기 때문에 더 나은 솔루션 중 하나입니다-askpass가 설치되어 있고 X 전달이 활성화되어 있으면됩니다.
David Gardner

1
설치 후 매력처럼 작동합니다 ssh-askpass. 방금의 의미를 찾아야 만했습니다 -chavzPe.
krlmlr

시도했지만 원격 컴퓨터에서 프롬프트가 열리고 로컬 컴퓨터로 전달되지 않습니다. X11Forwarding이 작동 중 xeyes입니다. SSH를 사용하여 실행 하여 확인했습니다 .
Joyce Babu

7

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

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

5

오늘이 문제가 발생하여 구성 파일을 수정하거나 사용자 계정에 루트 수준 권한을 부여 할 필요없이 해결했습니다. 내 특별한 설정 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의 자격 증명을 사용하여 시스템에 액세스하도록 지시 합니다. 내 요구 사항은 위의 질문과 약간 달랐지만 시스템 구성을 조정하지 않고 관리하는 특정 컴퓨터의 모든 사용자 디렉토리를 신속하게 백업 할 수있었습니다.


2
훌륭합니다. 에 대한 -i옵션을 잊었습니다 ssh. --rsync-path="sudo /usr/bin/rsync" 기계에 sudo가 있으면 사용할 수 있습니다 bar. 그러면 다음 root@foo과 같이 읽고 root@bar쓰지만 A@foo-> 를 통해 전송 B@bar합니다. 감사!
ctbrown

소유자 (예 : 루트)를 보존하지 않습니다. 맞습니까?
Andris

3

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


1
이 답변을 찬성했지만 rsynch 데몬을 실행하는 방법과 루트 액세스로 사용하는 방법에 대한 설명이 더 좋습니다.
Mike Lippert

rsync는 root로 시작한 경우에도 루트 권한을 삭제하고 모든 파일을 전송할 수는 없기 때문에 rsync as daemon은이 경우와 일치하지 않습니다.
teissler

2

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

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

1
일반적으로 암호를 명령 줄 한 줄짜리에 넣는 것은 좋지 않습니다. 예를 들어 프로세스 트리에 표시됩니다. 때로는이 유형의 문장에서 실제 비밀번호를 $( cat my_password.txt )약간 더 나은 것으로 대체 하지만 일반적으로 CLI에서 비밀번호가 필요하지 않은 방식으로 한쪽 끝에 권한을 구성하거나 SSH 키를 사용하는 것이 좋습니다.
JDS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.