web-dev-qa-db-ja.com

Python script / non-interactivelyを介してユーザーのパスワードを変更する安全な方法

ご質問

  1. Pythonスクリプトを介して非対話的にユーザーのパスワードを設定するためのより安全でより良い方法はありますか?私の現在のソリューションは Fabric からchpasswdを使用していますスクリプト:別のオプションは Fabric スクリプト内から Pexpect を使用することです。
  2. 現在のパスワード設定方法はセキュリティ上の問題ですか?私が目にする潜在的なセキュリティの問題は、パスワードがローカル端末で次のようにクリアテキストとして表示されることです。
    [xxx.xx.xx.xxx] run: echo "johnsmith:supersecretpassw0rd" | chpasswd
    Fabric スクリプトをラップトップから実行するだけなので、考えないこれはセキュリティです問題ですが、他の人の意見に興味があります。

バックグラウンド

作成したばかりのPythonスクリプトを使用して Fabric を使用して、新しく構築された Slicehost Ubuntuスライスを構成します。ファブリックに慣れていない場合は、 、それは Paramiko 、Python SSH2クライアントを使用して、「アプリケーションのデプロイメントまたはシステム管理タスク」のためにリモートアクセスを提供します。

Fabric スクリプトで最初に行うことの1つは、新しい管理者ユーザーを作成してパスワードを設定することです。 Pexpect とは異なり、Fabricはリモートシステムでインタラクティブコマンドを処理できないため、ユーザーのパスワードを非インタラクティブに設定する必要があります。現在、ユーザー名とパスワードをクリアテキストとして読み取るchpasswdコマンドを使用しています。

現在のコード

# Fabric imports and Host configuration excluded for brevity
root_password = getpass.getpass("Root's password given by SliceManager: ")
admin_username = Prompt("Enter a username for the admin user to create: ")
admin_password = getpass.getpass("Enter a password for the admin user: ")
env.user = 'root'
env.password = root_password
# Create the admin group and add it to the sudoers file
admin_group = 'admin'
run('addgroup {group}'.format(group=admin_group))
run('echo "%{group} ALL=(ALL) ALL" >> /etc/sudoers'.format(
    group=admin_group)
)
# Create the new admin user (default group=username); add to admin group
run('adduser {username} --disabled-password --gecos ""'.format(
    username=admin_username)
)
run('adduser {username} {group}'.format(
    username=admin_username,
    group=admin_group)
)
# Set the password for the new admin user
run('echo "{username}:{password}" | chpasswd'.format(
    username=admin_username,
    password=admin_password)
)

ローカルシステムターミナルI/O

$ fab config_rebuilt_slice
Root's password given by SliceManager: 
Enter a username for the admin user to create: johnsmith
Enter a password for the admin user: 
[xxx.xx.xx.xxx] run: addgroup admin
[xxx.xx.xx.xxx] out: Adding group `admin' (GID 1000) ...
[xxx.xx.xx.xxx] out: Done.
[xxx.xx.xx.xxx] run: echo "%admin ALL=(ALL) ALL" >> /etc/sudoers
[xxx.xx.xx.xxx] run: adduser johnsmith --disabled-password --gecos ""
[xxx.xx.xx.xxx] out: Adding user `johnsmith' ...
[xxx.xx.xx.xxx] out: Adding new group `johnsmith' (1001) ...
[xxx.xx.xx.xxx] out: Adding new user `johnsmith' (1000) with group `johnsmith' ...
[xxx.xx.xx.xxx] out: Creating home directory `/home/johnsmith' ...
[xxx.xx.xx.xxx] out: Copying files from `/etc/skel' ...
[xxx.xx.xx.xxx] run: adduser johnsmith admin
[xxx.xx.xx.xxx] out: Adding user `johnsmith' to group `admin' ...
[xxx.xx.xx.xxx] out: Adding user johnsmith to group admin
[xxx.xx.xx.xxx] out: Done.
[xxx.xx.xx.xxx] run: echo "johnsmith:supersecretpassw0rd" | chpasswd
[xxx.xx.xx.xxx] run: passwd --lock root
[xxx.xx.xx.xxx] out: passwd: password expiry information changed.

Done.
Disconnecting from [email protected]... done.
7
Matthew Rankin

実行するコマンドラインでパスワードを渡します。これらはおそらくあなたの端末だけでなく、 'ps'コマンドを発行する他のユーザーからも見えるかもしれません(システム構成に依存するかもしれません)。そして、パスワードはプレーンテキストです。

私はファブリックを知りませんが、stdin/stdout(subprocess.Popen()など)を介して実行されたコマンドと通信する可能性がある場合は、おそらく 'echoの代わりにそれを使用する方が良いでしょうユーザー名:パスワード| ... '。

また、Pythonスクリプトでパスワードハッシュを作成することもできます(cryptモジュールと "$ 1 $ XXXXXXXX $"( "X"はランダムな文字)ソルトを使用)それをchpasswd -eに渡します。プレーンテキストのパスワードは表示されず、ログにも記録されません。

3
Jacek Konieczny

非対話型のパスワード設定で通常行うことは、ランダムなパスワードを生成して変数に設定し、その変数をコマンドに渡すことです。パスワードを工夫する必要はなく、標準のパスワードをプレーンテキストファイルに残す必要もありません。

これが ランダムパスワードを生成するためのアクティブ状態のレシピ です。

セキュリティに関する限り、自分の端末にパスワードを印刷することはそれほど問題ではないと思います(ランダムパスワードを使用すると、とにかくそれを作成して、作成されたパスワードを書き留めることができます) 。

ファブリックがsshで行う何か異なることはありますか? -sshを経由するほとんどのものはとにかく暗号化されるべきです。

2
snk

ファブリックでwithからchpasswdを使用している場合は、コマンドラインからプレーンテキストのパスワードを使用しないようにしてください。パスワードが表示されるのは標準出力だけではなく、/ var/log/secureにも書き込まれます。ファブリックで使用できます

with hide('running', 'output', 'error'):
     <your task here>

また、ハッシュ文字列をchpasswdコマンドと共に使用して、安全なログでもパスワードがプレーンテキストで表示されないようにしてください。まず、使用するパスワードを決定し、ハッシュ文字列を生成します。そのためにopensslを使用できます。

openssl passwd -1

これにより、パスワードの入力とMD5ハッシュの生成を求めるプロンプトが表示されます。これをスクリプトで次のように使用できます。

echo "<user>:<MD5-hash>" | chpasswd -e

上記のコマンドの-eフラグは、パスワードが暗号化されていることをchpasswdに通知します。

2
sabs6488

ファブリックの次の1.0リリース(現在gitブランチから入手可能)では、リモートエンドで インタラクティブセッション が許可されます。

1

新しいスライスを自動構成して、ログインしてすぐにパスワードを変更していただけませんか?時には、最も単純なアプローチが最善です。

しかし、別の方法として、暗号化されたパスワードをローカルに生成し、暗号化されたパスワードを/ etc/shadowファイルに書き込むこともできます。この方法では、プレーンテキストをまったく使用しません。

最初のパスワードを入力するときは、ローカルシステムを信頼する必要があることに注意してください。

ちなみに、自動構成のコピーを利用できるようにして、すべてを最初から作成する代わりに使用することはできますか?現在私はbashを介してすべてを行っています。

このようなもの?

sed 's/^root:.*$/root:$PASSWD:13063::::::/' /etc/shadow > /etc/shadow
0
un33k