きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Dockerで簡単に暗号化したUNIXパスワードのハッシュを生成する(DockerでPythonスクリプトを実行)

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()))

参考情報