Dockerを使用するとローカルに暗号化したUNIXパスワードのハッシュで必要なPython等を導入する必要がありません。
今回の記事では、Pythonのスクリプトで暗号化したUNIXパスワードのハッシュを簡単に作る方法を記します。
なお、このハッシュを作る方法は正しいかわかりませんので、実施する際は自己責任でお願いします。
※ 「Pythonをローカルにインストールせずに、DockerでPythonスクリプトを実行したい」という考えが先にあり、その後にユースケースを考えています。そのため、ユースケースに特化して処理をするならば、OpenSSLのDockerイメージを使用する等々の方が適切です。
前提
- pipを使わない
環境
- Docker
- version 20.10.10, build b485636
- Python
対応
ワンライナーで実施する
パスワードを暗号化してハッシュで取得するスクリプトがワンライナーで作っている場合は、次のコマンドで十分です。
docker run -it --rm python python3 -c "import crypt; import getpass; print(crypt.crypt(getpass.getpass()))" # 実行後 # Password: # $6$BuxmkdTtpoJRk2Uq$cfjdbWHMTi8Y72hK6xg56Z5JzkdwwhnN51tKltJzYF/xZX4wRBhJ.Q9UL5YR0l2kfDdC/C3viyrcCK8EGQM0b0
解説
# 元 docker run -it --rm python python3 -c "import crypt; import getpass; print(crypt.crypt(getpass.getpass()))" # Dockerのコンテナで実行する docker run # インタラクティブにターミナルを使用する -it # 処理終了時にコンテナ停止する -rm # コンテナ名 python # コンテナで実行するコマンド python3 -c "import crypt; import getpass; print(crypt.crypt(getpass.getpass()))" # pythonにコマンド実行させるオプション -c # pythonが実行するコマンド "import crypt; import getpass; print(crypt.crypt(getpass.getpass()))"
Pythonのコマンドはワンライナーにしているだけで、実際には次のスクリプトです。
import crypt # ハッシュ生成(本来はUnixパスワード検証) import getpass # 入力したパスワードを画面に表示させない print(crypt.crypt(getpass.getpass()))
スクリプトで実施する
スクリプトとして用意している場合、スクリプトをDockerコンテナにマウントすることで特にローカルに準備することなく実施できます。
ワンライナーで実施していたスクリプトをscript.py
という名称にしたうえで、パスを設定すると実施できます。
docker run -v /home:/root -it --rm python python3 /root/script.py docker run -v {ローカルのscript.pyが存在する絶対パス}:/root -it --rm python python3 /root/script.py
終わりに
他の暗号化する方法を探していましたが、pipする必要があり、pipを必要としない方法として探しました。
pipしたコンテナを生成すれば簡単ですが、コンテナ生成が地味に面倒なので素直にdocker run python bash
でログインして、pipして普通にコマンドを打ったほうが楽そうでした。
もし、コンテナに複数行のコマンドを渡す方法が分かっていれば、それも検証してみたいので、もしご存じの方がいらっしゃれば教えていただきたいです。
※ ワンライナーでやりたかったもの。SHA512で暗号化する方法(passlibにpipが必要)
from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.encrypt(getpass.getpass()))