SSH를 사용하여 비밀번호 없는 계정에 일관되고 안전한 접근 방식을 제공합니다.

SSH를 사용하여 비밀번호 없는 계정에 일관되고 안전한 접근 방식을 제공합니다.

어떤 경우에는 비밀번호가 없는 서버를 선호한다는 점을 인정해야 합니다. 일반적인 서버는 물리적으로 액세스할 수 있는 모든 사람에게 취약합니다. 따라서 어떤 경우에는 물리적으로 잠그고 신뢰하는 것이 가능합니다.어느물리적 접근.

기본 사상

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

관리 계정이든 사용자 계정이든 원격으로 서버에 액세스할 때 저는 항상 SSH 개인 키를 사용하는 것을 좋아합니다. 방금 생성한 계정에 대한 SSH 키를 쉽게 설정할 수 있으므로 (정기) 원격 액세스에 시스템 비밀번호가 필요하지 않습니다.

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

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

결론은 이론적으로는 그럴 필요가 없다는 것이다.어느유사한 사용 사례에 대한 시스템 비밀번호입니다. 따라서 문제는 이것이 일관되고 안전한 방식으로 발생하도록 시스템과 사용자 계정을 어떻게 구성하는가입니다.

로컬 액세스 세부정보

비밀번호 없이 루트 계정에 로컬로 액세스할 수 있는지 확인하는 방법은 무엇입니까? 루트 액세스 가 passwd -d너무 허용되고 권한이 없는 사용자가변화무료 루트, 이것은 잘못된 것입니다. passwd -l로그인을 방해하기 때문에 사용할 수 없습니다 .

로컬 액세스에는 로컬 키보드를 사용한 액세스만 포함됩니다. 매우 효과적인 솔루션기필코 아니다모든 사용자가 전환할 수 있도록 허용합니다(사용 su또는 에 관계없이 sudo).

원격 액세스 세부정보

최근까지는 위의 솔루션이 작동했지만 이제 SSH는 잠긴 사용자 계정을 확인하기 시작합니다. passwd -d같은 이유로 사용하지 못할 수도 있습니다. passwd -u그것이 어떤 결과로 이어질지에 대해 불평하기 때문에 우리는 그것을 사용할 수 없습니다 passwd -d.

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

user=...

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

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

최종 메모

제가 관심 있는 것은 루트 계정에 로컬로 로그인하고, 비밀번호 없이 루트를 포함한 모든 계정에 원격으로 로그인할 수 있는 솔루션입니다. 반면, 솔루션은 명확하게 설명된 방식, 특히 원격 사용자가 루트 계정이나 다른 사용자의 계정에 액세스하는 것을 허용하지 않는 경우를 제외하고는 보안에 영향을 주어서는 안 됩니다. 솔루션은 간접적으로 보안 문제를 일으키지 않을 정도로 강력해야 합니다.

승인되고 수여된 답변은 개별 도구의 세부 구성을 설명할 수도 있고 설명하지 않을 수도 있지만 명시된 목표를 달성하기 위한 핵심 사항을 포함해야 합니다. passwd, 등의 일반적인 도구를 사용하면 이 문제가 해결되지 않을 수 있습니다 ssh.susudo

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

생각해 보면 로그인 프로세스 대신 루트 셸을 시작하여 로컬 루트 액세스를 얻을 수 있습니다. 하지만 여전히 공개 키 확인이 아닌 비밀번호 확인만 잠그면 됩니다.

답변1

솔루션에 대한 요구 사항을 주요 사항으로 제공하겠습니다.

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

다음 예제는 제가 여기서 테스트하고 있는 Debian을 기반으로 합니다. 그러나 나는 이러한 원칙이 어떤 배포판(또는 실제로 PAM을 기반으로 한 모든 *ix 파생물)에 적용될 수 없는 이유를 알지 못합니다.

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

이 문제에 대한 해결책은 PAM과 /etc/securetty구성 파일을 활용하는 것이라고 생각합니다.

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

/etc/pam.d/login인증을 위해 다음과 같은 표준 행 세트가 있습니다(keyword로 시작하는 행 ) 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

이 파일은 UNIX 로그인이 성공한 경우 common-auth규칙을 건너뛰도록(거부) PAM에 지시합니다 . 일반적으로 이는 /etc/shadow.

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

이 줄을 약간 수정하면 auth루트 로그인을 허용하는 규칙을 정의할 수 있습니다.비밀번호 없이에 지정된 tty 장치에서 /etc/securetty. 일치가 성공할 경우 건너뛸 행 수로 대체되도록 success=ok이 매개변수를 수정해야 합니다 . 여기에 표시된 경우 해당 숫자는 이며 다음 줄로 이동합니다.okauth3auth ... pam_permit.so

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

비밀번호 없이 사전 승인된 사용자 루트 원격 로그인

이는 인증된 사용자의 SSH 키를 루트 authorized_keys파일에 직접 포함하기 위한 것입니다.

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

여기에는 인증된 사용자의 SSH 키가 직접 포함되어 해당 사용자 .ssh/authorized_keys파일에 추가됩니다. (전형적인원격 사용자 chris는 비밀번호 없이 로컬 사용자 chris에 로그인하려고 합니다.상상하다. )

생성 후 계정은 기본적으로 잠긴 상태로 유지되지만(즉, !비밀번호 필드에서만 /etc/shadow) SSH 키 기반 로그인은 허용됩니다. 새 사용자의 파일에 키를 넣으려면 루트가 필요합니다 .ssh/authorized_keys. 무엇인가요너무 뻔하지 않음예, 이 방법은 UsePAM Yes중간 설정에서만 사용할 수 있습니다 /etc/ssh/sshd_config. PAM은 !"비밀번호로 인해 계정이 잠겼지만 다른 접근 방법은 허용될 수 있습니다."와 !..."계정이 잠겼습니다. 그게 전부입니다."를 구별합니다. ( UsePAM No설정된 경우 OpenSSH는 !잠긴 계정을 나타내기 위해 시작 암호 필드의 존재를 고려합니다.)

사전 승인된 사용자의 모든 계정은 비밀번호 없이 원격으로 로그인 가능

당신이 이 시설을 원하는지 잘 모르겠습니다. 즉, 일부 인증된 사용자는 비밀번호 없이 SSH를 통해 모든 로컬 계정에 로그인할 수 있습니다.

이것을 테스트할 수는 없지만 OpenSSH 5.9 이상에서는 가능하다고 생각합니다. 이를 통해 두 번째 이름을 포함하도록 구성 파일을 authorized_keys편집 할 수 있습니다 . 선택한 인증된 사용자의 공개 키를 이 파일에 추가하세요. 루트가 소유하고 루트만이 쓰기 권한(0644)을 갖습니다./etc/ssh/sshd_config/etc/ssh/authorized_keys

답변2

NOPASSWDSSH 키와 전체 액세스 권한이 있는 실제(루트가 아닌) 사용자 계정을 원하는 것 같습니다 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

who이를 통해 누가 로그인( 또는 시도)했는지 확인 last하고 로그인을 유지할 수 있습니다 /var/log/auth.log.

비밀번호 없이 로그인

이전 시스템에서는 해시를 편집 /etc/passwd(또는 약간 오래된 시스템에서는 /etc/shadow)하고 제거할 수 있으므로 예를 들어 bob:$1$salt$hash:12345:0:99999:7:::해시는 bob::12345:0:99999:7:::. 그게 당신이 필요한 전부입니다. 현대 시스템은 이것을 좋아하지 않습니다. 다른 방법도 있을 수 있지만 제가 방금 확인한 방법은 다음과 같습니다 (출처:레오를 위한 무작위 아이템) :

실제 정보를 이용해 /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 구성에 추가할 수 있는 추가 보안 조치에 대한 문서입니다.

이제 귀하의 사용자할 수 없다비밀번호가 비어 있으므로 다음을 통해 로그인하십시오 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맨 아래에 2개였습니다. 확인 : passwd그런 다음 mv ~/.bash_profile.real ~/.bash_profile처음 로그인할 때 새 비밀번호를 설정합니다.)

위험

귀하는 사용자를 완전히 신뢰합니다. 사용자가 다른 사용자의 ~/.ssh/authorized_keys파일을 망쳐 액세스를 취소하고 감사하는 기능을 변경하는 것을 막을 수는 없지만 전체 루트 액세스 권한을 부여하는 경우 이는 불가피합니다.

결론적으로

이제 모든 사용자는 조직의 구성원입니다.스도그룹화하고 루트 셸에 대해 비밀번호 없이 완전한 액세스 권한을 갖습니다. 이러한 사용자의 계정에는 비밀번호가 없으며 SSH 키를 사용하여 원격으로 로그인할 수 있습니다.

직원을 잃은 경우 해당 직원의 계정을 삭제할 수 있습니다. 직원의 노트북 중 하나를 도난당한 경우 authorized_keys사용자 파일에서 노트북의 SSH 키를 삭제할 수 있습니다. 보안 위반이 있는 경우 로그에 로그인한 사람이 표시됩니다.

관련 정보