SSH를 사용하여 암호없는 계정에 대한 일관되고 안전한 접근


13

어떤 경우에는 암호가없는 서버를 좋아한다는 것을 인정해야합니다. 일반적인 서버는 물리적으로 액세스 할 수있는 모든 사람에게 취약합니다. 따라서 어떤 경우에는 물리적으로 잠그고 물리적 액세스 를 신뢰 하는 것이 실용적 입니다.

기본 컨셉

이론적으로 그러한 서버에 실제로 도달 root하면 로그인 으로 간단히 입력하여 비밀번호없이 관리 작업을 수행 할 수 있어야하며 비밀번호를 묻지 않아야합니다. 사용자 계정에도 동일하게 적용되지만 실제로는 실제로 액세스하지는 않습니다. 따라서 (가끔) 로컬 액세스에 시스템 암호가 필요하지 않습니다.

관리 또는 사용자 계정으로 서버에 원격으로 액세스 할 때는 항상 SSH 개인 키를 사용해야합니다. 방금 생성 한 계정에 SSH 키를 설정하는 것은 매우 쉬우므로 (일반) 원격 액세스에 시스템 암호가 필요하지 않습니다.

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

결론은 이론적으로, 우리는 neeed 않을 것이다 어떤 같은 사용 사례에 대한 시스템 암호를. 문제는 시스템과 사용자 계정이 일관되고 안전한 방식으로 이루어 지도록 구성하는 방법입니다.

로컬 액세스 세부 사항

암호없이 루트 계정에 로컬로 액세스 할 수 있도록하려면 어떻게해야합니까? passwd -d루트 액세스가 너무 관대하고 권한이없는 사용자가 무료로 루트로 전환 할 수 있기 때문에 사용할 수 있다고 생각하지 않습니다 . passwd -l로그인 할 수 없으므로 사용할 수 없습니다 .

로컬 액세스는 로컬 키보드를 사용한 액세스에 관한 것입니다. 따라서 유효한 솔루션 사용자 전환 ( su또는 사용 여부)을 허용하지 않아야합니다sudo .

원격 액세스 세부 사항

최근까지 위의 솔루션이 작동했지만 이제 SSH가 잠긴 사용자 계정을 확인하기 시작했습니다. 우리는 아마 passwd -d같은 이유로 사용할 수 없습니다 . 우리는 passwd -u그것이 무엇으로 이어질 것이라고 불평 하기 때문에 사용할 수 없습니다 passwd -d.

이 부분에 더미 암호를 사용하는 해결 방법이 있습니다.

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

SSH에서 잠긴 계정 검사를 완전히 해제 할 수도 있지만 잠긴 계정에 대한 지원을 유지하고 잠금을 해제하는 것이 더 좋습니다.

최종 노트

내가 관심이있는 것은 암호없이 로컬로 루트 계정과 루트를 포함하여 모든 계정을 원격으로 로그인 할 수있는 솔루션입니다. 반면에 솔루션은 명시 적으로 설명 된 방식을 제외하고 보안에 영향을 주어서는 안됩니다. 특히 원격 사용자가 루트 계정이나 다른 사용자 계정에 액세스 할 수 없도록해서는 안됩니다. 보안 문제가 간접적으로 발생하지 않도록 솔루션은 충분히 강력해야합니다.

승인되고 수여되는 답변은 개별 도구의 세부 구성을 설명하거나 설명하지 않을 수 있지만 명시된 목표를 달성하기위한 핵심 사항을 포함해야합니다. 이 아마 같은 도구의 일반적인 사용을 통해 해결 될 수 없습니다 passwd, ssh, su, sudo등이있다.

첫 번째 답변을 읽은 후 더 많은 아이디어

단지 아이디어 – 로그인 프로세스 대신 루트 쉘을 시작하여 로컬 루트 액세스를 달성 할 수 있습니다. 그러나 여전히 공개 키 인증이 아닌 비밀번호 인증 만 잠글 필요가 있습니다.


비밀번호없이 로컬 액세스에 사용자 정의 된 PAM 구성을 사용하고 sudo 및 SSH 로그온에 대해서도 동일하게 수행하십시오.
0xC0000022L

답변:


5

글 머리 기호로 솔루션을 제공 할 요구 사항 :

  1. 비밀번호가없는 루트 콘솔 로그인
  2. 사전 인증 된 사용자의 비밀번호없는 루트 원격 로그인
  3. 사전 승인 된 사용자의 지정된 계정에 대한 비밀번호없는 원격 로그인
  4. 사전 승인 된 사용자의 모든 계정에 대한 비밀번호없는 원격 로그인

다음 예제는 데비안을 기반으로합니다. 테스트를 위해 여기 왔기 때문입니다. 그러나 원칙이 어떤 분포 (또는 실제로 PAM 기반 * ix 파생)에도 적용될 수없는 이유는 없습니다.

비밀번호가없는 루트 콘솔 로그인

필자가 접근하는 방식은 PAM과 /etc/securetty구성 파일 을 활용하는 것이라고 생각 합니다.

전제 조건으로 "충분히 안전한"루트 암호를 설정해야합니다. 콘솔 로그인에는 필요하지 않지만 무차별 대입 공격 시도를 비현실적으로 만들기 위해 존재합니다. 그렇지 않으면 계정은 완전히 정상적인 루트 계정입니다.

에서 /etc/pam.d/login나는 인증을위한 라인 (그 키워드로 시작하는 다음과 같은 표준 집합을 auth) :

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

참조 된 common-auth포함 파일에는 다음과 같은 관련 행이 있습니다.

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

common-auth파일은 "UNIX 로그인"이 성공하면 PAM에게 하나의 규칙 (거부)을 건너 뛰도록 지시합니다. 일반적으로의 일치를 의미합니다 /etc/shadow.

auth ... pam_securetty.so라인은에 지정된 tty 장치를 제외하고 루트 로그인을 방지하도록 구성되어 /etc/securetty있습니다. 이 파일에는 이미 모든 콘솔 장치가 포함되어 있습니다.

auth행을 약간 수정하면에 지정된 tty 장치 의 비밀번호없이 루트 로그인을 허용하는 규칙을 정의 할 수 /etc/securetty있습니다. success=ok매개 변수는이 정도로 수정 될 필요가 ok의 숫자로 대체 auth성공적인 일치 경우에는 제외 될 줄. 여기에 나와있는 상황에서, 그 숫자가 3의 아래로 이동하는 auth ... pam_permit.so라인 :

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

사전 인증 된 사용자의 비밀번호없는 루트 원격 로그인

이것은 루트 authorized_keys파일 에 추가되는 인증 된 사용자를 위해 ssh 키를 간단하게 포함 합니다.

사전 승인 된 사용자의 지정된 계정에 대한 비밀번호없는 원격 로그인

또한 권한이 부여 된 사용자가 적절한 해당 사용자 .ssh/authorized_keys파일 에 추가되는 ssh 키를 간단하게 포함 합니다. 일반적인 원격 사용자 chris는 로컬 사용자 chris 시나리오에 비밀번호없이 로그인하려고합니다 .

계정은 생성 후 기본 잠금 상태 (예 : !의 비밀번호 필드 /etc/shadow만 있음)로 유지되지만 SSH 키 기반 로그인은 허용됩니다. 새 사용자 .ssh/authorized_keys파일에 키를 넣으려면 root가 필요 합니다. 무엇 때문에 명확하지하는 경우이 방법에만 사용할 수 있다는 UsePAM Yes설정됩니다 /etc/ssh/sshd_config. PAM !은 "암호로 잠긴 계정이지만 다른 액세스 방법은 허용 될 수 있습니다"및 !..."계정 잠김. 기간"으로 구분됩니다. ( UsePAM No설정된 경우 OpenSSH !는 비밀번호 필드를 시작한 것으로 간주 하여 잠긴 계정을 나타냅니다.)

사전 승인 된 사용자의 모든 계정에 대한 비밀번호없는 원격 로그인

이 시설을 원하는지 아닌지는 분명하지 않았습니다. 즉, 인증 된 특정 사용자는 모든 로컬 계정에 비밀번호없이 로그인 할 수 있습니다.

이 시나리오를 테스트 할 수는 없지만 OpenSSH 5.9 이상을 사용하면 여러 authorized_keys파일을 정의 할 수 있습니다 /etc/ssh/sshd_config. 이라는 두 번째 파일을 포함하도록 구성 파일을 편집하십시오 /etc/ssh/authorized_keys. 선택한 권한이 부여 된 사용자의 공개 키를이 파일에 추가하여 권한이 root에 의해 소유되고 root에 대해서만 쓰기 액세스 권한을 갖도록하십시오 (0644).


# 1을 더 신중하게 검사하고 테스트해야합니다. 여전히 (강력한) 암호가 구성되어 있어도 매우 흥미로운 것처럼 보입니다. 요즘 새로 생성 된 사용자가 기본적으로 SSH 로그인에서도 잠기므로 # 3은 완료되지 않습니다. 실제로 포인트 4를 요구하지는 않았지만 어쨌든 매우 흥미로워 보입니다.
Pavel Šimerda

root의 강력한 암호는 필요하지만 사용되지는 않습니다. # 3 구현 방법을 알고 있다고 가정했습니다. 더 자세한 정보가 필요하면 알려주십시오. (데비안) 시스템에서는 .ssh/authorized_keys파일에 관련 공개 키가 포함되어 있으면 아직 비밀번호가 정의되지 않은 새 계정으로 ssh 할 수 있습니다. 도움이 되나요?
roaima

데비안에서 볼 수있는 행동을 복구 할 수있는 훌륭하고 표준적인 방법이 필요하다고 생각합니다. 즉, 새로 만든 계정은 공개 키 계정이 아닌 암호 인증을 위해서만 잠겨 있습니다.
Pavel Šimerda

이전 주석에서 ssh 문을 확인하기 위해 만든 테스트 사용자 계정 !의 암호 필드에 단일 이 표시 됩니다 /etc/shadow. 매뉴얼 페이지에 따르면 이것은 암호가 일치하지 않는 유효한 계정을 나타냅니다.
roaima

1
흥미 롭습니다 . 최소한 그렇게 분명하지는 않습니다 . 감사합니다.
Pavel Šimerda

1

ssh 키와 전체 NOPASSWD액세스 권한을 가진 실제 (루트가 아닌) 사용자 계정을 원하는 것처럼 들립니다 sudo(요즘 대부분의 Linux 배포판에서 기본적으로 사용 가능하며 수동으로 설치하는 것도 쉽지 않습니다). 원격으로 작동하지 않는 각 사용자 계정에 대해 빈 암호를 가질 수 있습니다. 그러면 사용자가 실행 sudo -s되거나 사용자에게 ~/.bash_profile해당 명령 만 포함됩니다.

수도

각 사용자를 sudoUNIX 그룹에 추가하십시오 (예 : usermod -a -G sudo USERNAME이전 시스템에서는이를 수행하는 데 직관적이지 않은 방법이 있지만 최악의 경우 /etc/groups직접 편집 ).

에서 /etc/sudoers또는 /etc/sudoers.d/local,이 같은 라인을 원하는 :

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

자동 루트 액세스를 원하는 경우이를 사용자의 프로필에 추가하십시오. 의 경우 bash는 다음과 ~/.bash_profile같습니다.

sudo -s

그러면 누가 로그인했는지 (try who또는 last) 볼 수 있으며 로그는 그대로 둡니다 /var/log/auth.log.

비밀번호없는 로그인

훨씬 오래된 시스템에서는 편집 /etc/passwd하거나 약간 오래된 시스템 /etc/shadow에서 해시를 제거하면 bob:$1$salt$hash:12345:0:99999:7:::됩니다 bob::12345:0:99999:7:::. 이것이 당신이 필요한 전부였습니다. 현대 시스템은 이것을 좋아하지 않습니다. 다른 방법이있을 수도 있지만 방금 확인한 방법은 다음과 같습니다 (출처 : Leo 's Random Stuff ) :

/etc/shadow실제 정보가있는 계정을 열고 관찰하십시오. 여기에는 달러 기호 ( $)로 구분 된 세 가지 요소가 포함됩니다 . 이것들은 해싱 메커니즘, 소금 , 해시를 나타냅니다 . 소금에 주목 한 후 다음을 실행하십시오.

openssl passwd -1 -salt SALT

(이는 MD5를 해싱 메커니즘으로 사용합니다. 빈 암호이므로 걱정하지 않아도됩니다.) 암호를 묻는 메시지가 표시되면 Enter 키를 누릅니다. 후행 점을 포함하여 해당 문자열을 저장하고 해당 사용자의 행에서 첫 번째 콜론 뒤에 붙여 넣습니다 /etc/shadow(이는 첫 번째 콜론과 두 번째 콜론 사이의 기존 내용을 대체해야 함). (말 그대로 SALT소금으로 사용하지 마십시오 !)

SSH

귀하의 ssh데몬 구성에 하나 살고 /etc/sshd_config/etc/ssh/sshd_config. 적절한 보안을 위해 다음 줄을 포함하는 것이 좋습니다.

PermitRootLogin no
PermitEmptyPasswords no

ssh 구성에 추가 할 수있는 추가 보안 조치는 정교한 보안 공격자에 대한 보안 강화를 위해 Secure Secure Shell 쓰기를 참조하십시오 .

이제 비밀번호가 비어 있어 사용자 로그인 할 수 없습니다ssh (필수 보안 조치 임). 이는 ssh 키로 만 로그인 할 수 있음을 의미합니다.

각 클라이언트 시스템에 대해 각 사용자는 ssh 키 쌍을 작성해야합니다. 예 :

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

에 개인 키가 생성 $HOME/.ssh/id_rsa되고에 공개 키가 생성됩니다 $HOME/.ssh/id_rsa.pub. 해당 사용자에게 공개 키를 보내서이 서버에 추가하도록 $HOME/.ssh/authorized_keys하십시오 ( $HOME/.ssh예 : 각 사용자의 모드는 700이어야합니다 mkdir -p ~user/.ssh && chmod 700 ~user/.ssh).

ssh 키를 원하지 않는 사용자는 실제 시스템으로 넘어갈 수 있습니다. 빈 암호로 로그인 passwd하면 셸에서 입력 하고 암호를 설정하여 원격으로 액세스 할 수 있습니다.

(실제로 IT 부서를 운영 할 때 사람들이 시스템 모음에 액세스 할 수 있도록이 기술을 사용했습니다. 사용자가 ssh 키를 사용하도록 강요했으며 암호를 제공 할 필요가 없었습니다. 초기 ~/.bash_profile에는 두 줄이있었습니다. passwd다음 mv ~/.bash_profile.real ~/.bash_profile그래서 그들은 처음 로그인시 새 암호를 설정합니다.)

위험

사용자를 완전히 신뢰하고 있습니다. 사용자가 다른 사용자의 ~/.ssh/authorized_keys파일 을 엉망으로 만드는 것을 막을 수는 없으므로 액세스를 취소하고 감사하는 기능을 변경할 수는 없지만 전체 루트 액세스 권한을 부여하는 경우 피할 수 없습니다.

결론

각 사용자는 이제 sudo 그룹 의 구성원이며 루트 셸에 대한 모든 비밀번호없이 액세스 할 수 있습니다. 이러한 사용자는 자신의 계정에 대한 비밀번호가 없으며 ssh 키를 사용하여 원격으로 로그인 할 수 있습니다.

직원 중 한 명을 잃으면 계정을 제거 할 수 있습니다. 직원의 랩톱 중 하나를 도난당한 경우 해당 사용자의 authorized_keys파일 에서 해당 랩톱의 ssh 키를 제거 할 수 있습니다 . 보안 위반이있는 경우 로그인 한 사람을 표시하는 로그가 있습니다.


sudo 에 대한 부분은 사용자를 전환하지 않고 새로운 로그인에 대한 독점적 인 질문을 놓칩니다 . 명확하게하기 위해 질문을 수정했습니다. 비밀번호없는 로그인 에 대한 부분은 passwd -d질문에서 와 똑같은 잘못된 동작을 나타내므로 su비밀번호없이 해당 사용자로 전환 할 수 있습니다. 위험 섹션에는 문제의 핵심이되는 두 가지 사항 (다른 사용자의 데이터와의 메시지 및 루트 액세스 권한 부여)이 설명되어 있습니다. 따라서 개별 섹션이 훌륭하게 작성되었지만 이것은 결코 질문에 대한 답변이 아닙니다.
Pavel Šimerda

사용자를 추가 한 다음 사용자를 제한한다고 가정했습니다.
Adam Katz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.