SSH와 sudo를 고수하세요

SSH와 sudo를 고수하세요

환경을 설정하고 네트워크 서버에 상대적으로 복잡한 웹 애플리케이션을 설치하기 위한 쉘 스크립트가 있는데, 이는 빠른 악성 해킹에서 더 크고 약간 덜 나쁜 해킹으로 점차 발전했습니다.

이전에 내 스크립트에는 사용을 위해 개발 컴퓨터에서 원격 서버로 쉽게 복사할 수 있는 "부트스트랩" 기능이 내장되어 있었습니다. 스크립트를 넣을 폴더를 만든 다음 스크립트를 복사하려면 루트 로그인이 필요했습니다. .

이 프로젝트가 성장함에 따라 이제 우리가 의존해야 하는 다른 소프트웨어에는 자체 설정 스크립트를 위한 "sudo" 환경(루트 로그인 대신)이 필요하다는 사실이 밝혀졌습니다. 따라서 설정 스크립트를 루트 예상에서 사용으로 전환하고 싶습니다. sudo(특히 이 스크립트를 다른 사람과 공유하고 루트를 사용할 수 없는 서버(예: Ubuntu)에서 작동하도록 할 수 있습니다).

현재 내 부트스트랩 기능은 다음을 수행합니다.

bootstrap()
{
    INSTALL_DIR=/local/bin
    SCRIPT=`basename $0`

    echo "Copying script '${SCRIPT}' onto server: '${RHOST}' into '${INSTALL_DIR}'"
    echo "(You need to login (as root) 2 times.)"
    ssh root@$RHOST "umask 027; mkdir -p $INSTALL_DIR"
    scp -p "$SCRIPT" root@$RHOST:/$INSTALL_DIR
    echo "Done. Now login to the server and run the script as root."
    exit
}

sudo를 사용하도록 변환하는 방법을 모르겠습니다. scp는 파일이 있는 폴더에 쓸 수 있는 사용자로 로그인하기를 원합니다. 루트 계정이 없으면 이 작업을 수행할 수 없습니다.

아니면 내가 이것을 너무 복잡하게 만들고 있는 걸까? 원격 서버의 일반 사용자가 본질적으로 한 단계로 루트를 제거한 경우 이러한 관리 스크립트를 저장할 "깔끔한" 장소를 만드는 대신 사용자 자신의 파일 공간에 있는 위치로 scp할 수 있습니다. 사용자는 sudo를 사용하여 거기에서 스크립트의 설치 부분을 실행할 수 있습니다. (발생할 수 있는 유일한 문제는 다른 관리자가 스크립트를 실행해야 하고 다른 사용자의 파일에 액세스할 수 없는 경우일 수 있습니다.)

답변1

SSH 외에 이 문제를 해결하는 방법에는 여러 가지가 있습니다. 그 외에도 루트 계정과 "sudo" 환경에 대해 약간 모호합니다. 루트 계정은 셸 액세스(Ubuntu의 기본값)를 허용하지 않으며 관리자 권한을 부여하려면 사용자에게 sudo 액세스 권한을 부여해야 한다는 의미라고 가정합니다. 루트 계정 자체는 여전히 존재합니다(uid/gid 0).

SSH와 sudo를 고수하세요

SSH, sudo 및 안전하게 파일 복사를 예로 들어 보겠습니다. 파일을 공개 위치에 복사한 다음 sudo를 사용하여 제한된 위치로 복사하거나 이동할 수 있습니다. 파일이 적어도 일시적으로 공개 위치에 있기 때문에 이는 보안에 일부 영향을 미칩니다. 이 문제의 보안 요소를 완화하는 방법도 많이 있습니다.

원격 서버의 임시 위치에 파일을 안전하게 복사합니다.

scp -p xfer_file jschaeffer@aiur:/tmp

이제 SSH를 사용하여 서버에 연결하고 이를 영구 위치로 복사하거나 이동합니다.

ssh -t jschaeffer@aiur: sudo cp /tmp/xfer_file /perm

여기서 핵심 내용은 ssh에 대한 -t입니다. 맨 페이지에서.

 -t      Force pseudo-tty allocation.  This can be used to execute arbitrary screen-based programs on a
         remote machine, which can be very useful, e.g. when implementing menu services.  Multiple -t options
         force tty allocation, even if ssh has no local tty.

비밀번호를 묻는 메시지를 전혀 표시하지 않음

이 외에도 비밀번호가 필요하지 않고 사용자에게 메시지가 표시되지 않도록 sudo 규칙을 정의할 수 있습니다.

루트가 아닌 사용자가 비밀번호 없이 루트에 인증하도록 허용

이 방법의 대안은 공개 키를 사용하는 것입니다. 공개 키를 사용하여 사용자에게 다른 계정에 대한 액세스 권한을 부여할 수 있습니다. 이는 보안에도 영향을 미칩니다. 사용자에게 상자에 대한 전체 루트 액세스 권한을 부여합니다(아래에서 몇 가지 간단한 정보 참조).

jschaeffer@defiler:~# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/jschaeffer/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /jschaeffer/.ssh/id_rsa.
Your public key has been saved in /jschaeffer/.ssh/id_rsa.pub.

그런 다음 공개 키를 원격 서버에 복사합니다(개인 키가 아닌 공개 키를 복사해야 합니다). 이 전체 논의는 직접적인 루트 액세스를 허용하지 않는 서버에 파일을 복사하는 것에 관한 것이기 때문에 루트 계정에 연결된 ssh-copy-id 또는 scp 명령은 표시하지 않습니다. 그럼에도 불구하고 키를 ~root/.ssh/authorized_keys로 전송하는 방법을 찾아야 합니다. 위의 전략을 사용하거나 플래시 드라이브 또는 다른 방법(rsync, ftp 등)에 복사할 수 있습니다.

루트 계정은 서버에서 비밀번호 없는 인증을 허용해야 합니다. /etc/ssh/sshd_config의 설정이 올바른지 확인하세요.

# Authentication:
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes

그런 다음 파일을 루트 계정에 직접 복사하십시오.

scp -p xfer_file root@aiur:/perm_location

Authorized_keys 파일에 옵션을 추가하여 SSH 연결 시 사용자가 실제로 수행할 수 있는 작업을 제한할 수 있습니다.

다른 옵션

물론 다른 옵션도 많이 있지만 나열하지는 않겠습니다.

  • Kerberos를 사용하세요. Kerberos는 안전하지 않은 네트워크의 보안을 중심으로 설계된 완전한 프로토콜입니다. 물론 이를 위해서는 전체 환경, 유지 관리, 하드웨어 등이 필요하지만 원하는 것이 아닐 수도 있습니다. SSH는 Kerbero와 통합되거나 Kerberos 대신 안전하지 않은 전송 대안을 사용할 수 있습니다.
  • 파일을 서버의 임시 위치에 복사하고 해당 디렉터리의 파일을 선택하여 영구 위치로 전송하는 원격 서버에서 루트로 cron 작업을 실행합니다.
  • rsync 파일
  • 두 서버(예: ftp, sftp, http)에 액세스할 수 있는 공통 위치에 파일을 저장합니다.
  • 루트 계정을 다시 활성화합니다.

답변2

rsync의 경우 사람들은 패턴을 사용하여 이를 구현합니다. 대부분의 Linux 설치에는 기본적으로 rsync가 포함됩니다.

rsync -e "ssh -t" --rsync-path="sudo rsync" ...

--https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Automated_Backup#Backup_with_rsync_and_sudo

답변3

쉽게 쓸 수 없는 곳에 데이터를 밀어넣는 대신 데이터를 끌어오는 건 어떨까요? 아니면 데이터를 쓸 수 있는 다른 곳에 푸시한 다음 원격 시스템에 데이터를 배치하시겠습니까? --아마도 새 파일을 얻기 위해 앱이 반송될 때일까요?

또한 일부 권장 사항은 프로덕션 시스템의 보안을 약화시킵니다.

관련 정보