web-dev-qa-db-ja.com

シェルスクリプトでユーザーのパスワードを確認する

ユーザーのパスワードを要求するスクリプトがあり、指定したパスワードが間違っているかどうかを確認したいと思います。

#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
5
Luis Veliz

ユーザーのパスワードをチェックする完全にポータブルな方法はありません。これには特権のある実行可能ファイルが必要なので、最初から作成することはできません。 [〜#〜] pam [〜#〜] は、ほとんどの非組み込みLinuxシステム、多くの組み込みシステム、およびその他のほとんどのUnixバリアントで使用されており、setuidバイナリが付属していますが、直接シェルインターフェイスがある場合は、PAMスタックを経由する必要があります。

Perl、Pythonまたは Ruby でPAMバインディングを使用できます。

いくつかの checkpassword 実装の1つをインストールできます。

ユーザーがSudoの実行を許可されている場合は、Sudo -kvは認証を要求します(Sudo構成でこれが無効になっていない場合)。しかし、ユーザーに関するsudoersルールがない場合は機能しません。

suを実行できます。これはほとんどの実装で機能します。これはおそらくあなたの場合に最善の策です。

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

シャドウファイルを使用して、特定のlocalパスワードが特定のユーザー名に対して正しいことを検証できます。

最近のほとんどのディストリビューションでは、ハッシュ化されたパスワードはシャドウファイル/ etc/shadow(rootのみが読み取り可能)に保存されています。 rootとして、次のように指定されたユーザーのシャドウファイルから行をプルします。

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ハッシュを計算し、シャドウファイルからの上記とまったく同じである必要があります。上記のコマンドの-1は、MD5ハッシュ用です。

3
DopeGhoti

これは、ローカルユーザーとリモートユーザーの両方で機能し、単純にパスワードハッシュを比較するのではなく、問題のユーザーとして完全な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.rbchmod +x ./authenticate_as.rb./authenticate_as.rb $username $passwordとして保存します。 Rubyとrpam gemが必要です。

2
jayhendren