쉘 스크립트를 사용하여 사용자 비밀번호 확인

쉘 스크립트를 사용하여 사용자 비밀번호 확인

사용자의 비밀번호를 묻는 스크립트가 있는데, 주어진 비밀번호가 잘못된지 확인하고 싶습니다.

#A little fragment of my script

read -sp 'Your password: ' password;

if [[ $password -ne WHAT GOES HERE? ]]; then
    MORE CODE HERE
else
    MORE CODE HERE
fi

답변1

사용자의 비밀번호를 확인하는 완전히 이식 가능한 방법은 없습니다. 이를 위해서는 권한 있는 실행 파일이 필요하므로 처음부터 새로 만들 수는 없습니다.폴리아크릴아미드대부분의 비임베디드 Linux 시스템과 많은 임베디드 시스템 및 대부분의 기타 Unix 변형의 경우 setuid 바이너리가 제공되지만 직접 쉘 인터페이스가 없으므로 PAM 스택을 거쳐야 합니다.

Perl, Python 또는루비.

하나 이상 설치할 수 있습니다.checkpassword구현.

사용자가 어떤 작업에 대해 sudo를 실행할 수 있는 경우 sudo -kv인증을 요청하는 메시지가 표시됩니다(sudo 구성에서 이 기능을 비활성화하지 않은 경우). 그러나 사용자와 관련된 sudoers 규칙이 없으면 이 방법은 작동하지 않습니다.

실행할 수 있습니다 su. 이는 대부분의 구현에서 작동합니다. 귀하의 상황에서는 이것이 최선의 선택일 수 있습니다.

if su -c true "$USER"; then
  echo "Correct password"
fi

답변2

주어진 것을 확인할 수 있습니다현지의섀도우 파일을 사용하는 지정된 사용자 이름의 비밀번호가 정확합니다.

대부분의 최신 배포판에서는 해시된 비밀번호가 섀도우 파일 /etc/shadow(루트만 읽을 수 있음)에 저장됩니다. 루트로서 다음과 같이 지정된 사용자의 섀도우 파일에서 이 줄을 추출합니다.

cat /etc/shadow | grep username

다음과 같은 내용이 표시됩니다.

username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::

사용자 이름 뒤에 $1이 있습니다. 이는 MD5 해시임을 나타냅니다. 그 뒤에 또 다른 $가 있고 (이 경우) TrOIigLp 뒤에 또 다른 $가 옵니다. TrOIigLp는 소금입니다. 그 다음에는 솔트로 해시된 해시된 비밀번호(이 경우 PUHL00kS5UY3CMVaiC0/g0)가 옵니다.

이제 다음과 같이 openssl을 사용하여 동일한 솔트를 사용하여 주어진 비밀번호를 해시할 수 있습니다.

openssl passwd -1 -salt TrOIigLp

프롬프트가 표시되면 주어진 비밀번호를 입력하십시오. openssl 명령은 제공된 솔트를 사용하여 MD5 해시를 계산해야 하며 이는 섀도우 파일에서 위와 정확히 동일해야 합니다. 위 명령은 -1MD5 해싱을 위한 것입니다.

답변3

이는 로컬 및 원격 사용자 모두에게 작동하며 단순히 비밀번호 해시를 비교하는 대신 문제의 사용자의 전체 PAM 스택에 대해 인증을 시도하는 비교적 강력한 솔루션입니다.

#!/usr/bin/env ruby

require 'rpam'

username = ARGV[0]
password = ARGV[1]

if Rpam.auth(username, password, service: 'system-auth')
  puts 'authentication successful'
  exit 0
else
  puts 'authentication failure'
  exit 1
end

실행하려면: ./authenticate_as.rb, chmod +x ./authenticate_as.rb및 로 저장하세요 ./authenticate_as.rb $username $password. 명확하지 않은 경우를 대비해 Ruby와 rpm gem이 필요합니다.

답변4

Python 버전은 다음과 같습니다.

$ mkdir /tmp/venv

$ cd /tmp/venv

$ python3 -m venv .

$ ./bin/pip install python-pam six
Collecting python-pam
  Using cached python_pam-2.0.2-py3-none-any.whl (10 kB)
Collecting six
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: python-pam, six
Successfully installed python-pam-2.0.2 six-1.16.0

$ ./bin/python
Python 3.11.5 (main, Aug 25 2023, 07:43:52) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pam
>>> pam.authenticate("pmorch", "mypass")
True
>>> 

~처럼https://pypi.org/project/python-pam/지적했다:

python-pam과모두인증을 수행하는 도구는 다음 두 가지 규칙을 따릅니다.

  • 루트(또는 권한 있는 액세스)가 있습니다. 모든 계정 비밀번호의 유효성을 확인할 수 있습니다.
  • 루트가 없습니다. 도구를 실행하는 사용자 이름의 유효성만 확인할 수 있습니다.

pmorch( 내 컴퓨터에 있습니다 . 아니요, mypass그건 내 실제 비밀번호가 아닙니다.

관련 정보