다음과 같이 ssh (루트 권한으로)를 통해 비밀번호를 가진 사용자를 만들려고했습니다.
ssh root@123.45.6.7 useradd -p $(openssl passwd -1 1234) newuser
그렇게함으로써, 나는 성공적이라는 계정을 만들 수 있습니다 newuser
(인,하지만 예상 비밀번호를 사용하여 로그인 할 수 있습니다 1234
)
큰 따옴표를 추가해도 아무런 차이가 없습니다.
ssh root@123.45.6.7 "useradd -p $(openssl passwd -1 1234) newuser"
그리고 해시 된 암호를 생성하여 로컬로 변수로 저장할 수 있는지 궁금하지만 여전히 운이 없습니다.
password=$(openssl passwd -1 1234)
ssh root@123.45.6.7 "useradd -p $password newuser"
내가 놓친 것이 있습니까? 미리 감사드립니다!
답변
이것은 전형적인 인용 문제입니다.
문제점 : 따옴표 나 큰 따옴표없이 명령 대체 ( $()
) 및 변수 확장 (에 $
의해 리턴 된 해시 된 암호 의 s가 openssl
변수 표시기로 처리됨)이 원격 쉘이 아닌 로컬 환경에서 수행되고 있습니다.
솔루션 : 로컬 환경에서 명령 대체 및 변수 확장을 막으려면 로컬 쉘에서 useradd
사용 된 명령 주위에 작은 따옴표를 사용 ssh
하십시오. 확장은 원격 비 로그인 비대화 형 쉘에서 이루어집니다.
ssh root@123.45.6.7 'useradd -p "$(openssl passwd -1 1234)" newuser'
인용문을 참고하십시오.
보안 문제들:
-
SSH
root
로그인을 비활성화해야합니다. 활성화해야하는 경우 키 기반 인증 만 허용해야합니다. -
MD5는 이미 고장 났으며 소금이 없으면 간단한 레인보우 테이블 공격을받습니다 (무차별 강제 / 사전 공격도 필요 없음).
openssl passwd
그래도 무작위 소금을 생성합니다. 어쨌든, 소금을 뿌린 채 SHA-2 사용을 고려해야합니다. -
명령에 인수로 전달 된 비밀번호는 (원격) 시스템의 다른 프로세스에서 볼 수 있습니다. 이것은
procfs
마운트 방법 (hidepid
)과 명령이 다시 작성 되는지 여부에 따라 다릅니다 (이 경우에는 그렇지 않습니다)
답변
@heemayl이 지적했듯이 MD5 암호 해시 알고리즘은 오래되었으며 현재 시스템은 최신 SHA-2 기반 암호 해시이며 사용자 정의 가능한 작업 요소가 있습니다. 그러나 OpenSSL 명령 행 도구는이를 지원하지 않는 것 같습니다.
chpasswd
유틸리티는 , 그러나, 당신은 시스템 설정에 따라 사용자의 암호를 변경할 수 있습니다.
이를 통해 새 사용자를 작성하고 원격에서 비밀번호를 변경할 수 있습니다.
echo "newuser:newpass" | ssh root@123.45.6.7 'useradd newuser; chpasswd'
chpasswd
명령 행이 아닌 stdin에서 사용자 이름과 비밀번호를 가져옵니다. 이것은 명령 행 인수가 시스템의 다른 모든 프로세스에 대해 표시되므로 openssl passwd
원격에서 실행 되는 경우 시스템의 모든 프로세스에 비밀번호가 순간적으로 표시 되므로 실제로 이점이 있습니다 .
시스템 crypt(3)
기능으로 알려진 암호 해시를 생성하기 위해 기성품 명령 줄 유틸리티가 있는지 확실하지 않습니다 . Perl에는 crypt
기능이 내장되어 있지만 적절한 소금을 생성해야합니다.