chpasswd
を使用していますスクリプト:別のオプションは Fabric スクリプト内から Pexpect を使用することです。[xxx.xx.xx.xxx] run: echo "johnsmith:supersecretpassw0rd" | chpasswd
。作成したばかりの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)
)
$ 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.
実行するコマンドラインでパスワードを渡します。これらはおそらくあなたの端末だけでなく、 'ps'コマンドを発行する他のユーザーからも見えるかもしれません(システム構成に依存するかもしれません)。そして、パスワードはプレーンテキストです。
私はファブリックを知りませんが、stdin/stdout(subprocess.Popen()
など)を介して実行されたコマンドと通信する可能性がある場合は、おそらく 'echoの代わりにそれを使用する方が良いでしょうユーザー名:パスワード| ... '。
また、Pythonスクリプトでパスワードハッシュを作成することもできます(crypt
モジュールと "$ 1 $ XXXXXXXX $"( "X"はランダムな文字)ソルトを使用)それをchpasswd -e
に渡します。プレーンテキストのパスワードは表示されず、ログにも記録されません。
非対話型のパスワード設定で通常行うことは、ランダムなパスワードを生成して変数に設定し、その変数をコマンドに渡すことです。パスワードを工夫する必要はなく、標準のパスワードをプレーンテキストファイルに残す必要もありません。
これが ランダムパスワードを生成するためのアクティブ状態のレシピ です。
セキュリティに関する限り、自分の端末にパスワードを印刷することはそれほど問題ではないと思います(ランダムパスワードを使用すると、とにかくそれを作成して、作成されたパスワードを書き留めることができます) 。
ファブリックがsshで行う何か異なることはありますか? -sshを経由するほとんどのものはとにかく暗号化されるべきです。
ファブリックで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に通知します。
ファブリックの次の1.0リリース(現在gitブランチから入手可能)では、リモートエンドで インタラクティブセッション が許可されます。
新しいスライスを自動構成して、ログインしてすぐにパスワードを変更していただけませんか?時には、最も単純なアプローチが最善です。
しかし、別の方法として、暗号化されたパスワードをローカルに生成し、暗号化されたパスワードを/ etc/shadowファイルに書き込むこともできます。この方法では、プレーンテキストをまったく使用しません。
最初のパスワードを入力するときは、ローカルシステムを信頼する必要があることに注意してください。
ちなみに、自動構成のコピーを利用できるようにして、すべてを最初から作成する代わりに使用することはできますか?現在私はbashを介してすべてを行っています。
このようなもの?
sed 's/^root:.*$/root:$PASSWD:13063::::::/' /etc/shadow > /etc/shadow