Bashスクリプトで暗号化されたパスワードを使用する方法
公開: 2022-01-29Linuxスクリプトを使用してパスワードで保護されたリソースに接続する必要がある場合は、そのパスワードをスクリプトに含めることに不安を感じる可能性があります。 OpenSSLはその問題を解決します。
パスワードとスクリプト
シェルスクリプトにパスワードを入れるのは良い考えではありません。 実際、それは本当に悪い考えです。 スクリプトが悪用された場合、それを読んだ人は誰でもパスワードが何であるかを知ることができます。 しかし、スクリプトを使用せざるを得ない場合、他に何ができるでしょうか。
プロセスがその時点に達したときにパスワードを手動で入力できますが、スクリプトが無人で実行される場合、それは機能しません。 ありがたいことに、パスワードをスクリプトにハードコーディングする代わりの方法があります。 直感に反して、これを実現するために別のパスワードを使用し、強力な暗号化を行います。
このシナリオ例では、UbuntuコンピューターからFedoraLinuxコンピューターにリモート接続する必要があります。 Bashシェルスクリプトを使用して、FedoraコンピューターへのSSH接続を確立します。 スクリプトは無人で実行する必要があり、リモートアカウントのパスワードをスクリプトに入れたくありません。 この場合、SSHキーを使用することはできません。これは、Fedoraコンピューターに対する制御または管理者権限がないふりをしているためです。
よく知られているOpenSSLツールキットを使用して暗号化を処理し、 sshpass
と呼ばれるユーティリティを使用してパスワードをSSHコマンドにフィードします。
関連: LinuxシェルからSSHキーを作成してインストールする方法
OpenSSLとsshpassのインストール
他の多くの暗号化およびセキュリティツールはOpenSSLを使用しているため、OpenSSLは既にコンピューターにインストールされている可能性があります。 ただし、そうでない場合は、インストールに少し時間がかかります。
Ubuntuでは、次のコマンドを入力します。
sudo apt get openssl
sshpass
をインストールするには、次のコマンドを使用します。
sudo apt install sshpass
Fedoraでは、次のように入力する必要があります。
sudo dnf install openssl
sshpass
をインストールするコマンドは次のとおりです。
sudo dnf install sshpass
Manjaro Linuxでは、次のコマンドでOpenSSLをインストールできます。
sudo pacman -Sy openssl
最後に、 sshpass
をインストールするには、次のコマンドを使用します。
sudo pacman -Sy sshpass
コマンドラインでの暗号化
スクリプトでopenssl
コマンドを使用する前に、コマンドラインで使用して理解してみましょう。 リモートコンピュータのアカウントのパスワードがrusty!herring.pitshaft
であるとしましょう。 openssl
を使用してそのパスワードを暗号化します。
その際、暗号化パスワードを提供する必要があります。 暗号化パスワードは、暗号化および復号化プロセスで使用されます。 openssl
コマンドには多くのパラメーターとオプションがあります。 それぞれについてすぐに見ていきます。
エコー 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass: 'pick.your.password'
echo
を使用して、リモートアカウントのパスワードをパイプを介してopenssl
コマンドに送信しています。
openssl
パラメータは次のとおりです。
- enc -aes-256-cbc :エンコーディングタイプ。 暗号ブロック連鎖を備えたAdvancedEncryption Standard256ビットキー暗号を使用しています。
- -md sha512 :メッセージダイジェスト(ハッシュ)タイプ。 SHA512暗号化アルゴリズムを使用しています。
- -a :これは
openssl
に、暗号化フェーズの後、復号化フェーズの前にbase-64エンコーディングを適用するように指示します。 - -pbkdf2 :パスワードベースの鍵導出関数2(PBKDF2)を使用すると、ブルートフォース攻撃でパスワードを推測するのがはるかに困難になります。 PBKDF2は、暗号化を実行するために多くの計算を必要とします。 攻撃者は、これらすべての計算を複製する必要があります。
- -iter 100000 :PBKDF2が使用する計算の数を設定します。
- -salt :ランダムに適用されたsalt値を使用すると、プレーンテキストが同じであっても、暗号化された出力が毎回異なります。
- -pass pass: 'pick.your.password' :暗号化されたリモートパスワードを復号化するために使用する必要のあるパスワード。
pick.your.password
を、選択した堅牢なパスワードに置き換えます。
暗号化されたバージョンのrusty!herring.pitshaft
パスワードがターミナルウィンドウに書き込まれます。
これを復号化するには、暗号化に使用したのと同じパラメーターを使用して、暗号化された文字列をopenssl
に渡す必要がありますが、 -d
(復号化)オプションを追加します。
エコーU2FsdGVkX19iiiRNhEsG + wm / uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass: 'pick.your.password'
文字列が復号化され、元のテキスト(リモートユーザーアカウントのパスワード)がターミナルウィンドウに書き込まれます。
これは、リモートユーザーアカウントのパスワードを安全に暗号化できることを証明しています。 暗号化フェーズで提供したパスワードを使用して、必要なときに復号化することもできます。
しかし、これは実際に私たちの状況を改善しますか? リモートアカウントのパスワードを復号化するために暗号化パスワードが必要な場合は、復号化パスワードをスクリプトに含める必要がありますか? ええ、そうです。 ただし、暗号化されたリモートユーザーアカウントのパスワードは、別の隠しファイルに保存されます。 ファイルへのアクセス許可は、あなた以外の誰も、そして明らかにシステムのrootユーザーがファイルにアクセスすることを防ぎます。
暗号化コマンドからの出力をファイルに送信するには、リダイレクトを使用できます。 このファイルの名前は「.secret_vault.txt」です。 暗号化パスワードをより堅牢なものに変更しました。
エコー 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass: 'secret#vault!password'> .secret_vault.txt
何も表示されませんが、パスワードは暗号化されて「.secret_vault.txt」ファイルに送信されます。
隠しファイルのパスワードを復号化することで、それが機能したことをテストできます。 ここではecho
ではなくcat
を使用していることに注意してください。
cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass: 'secret#vault!password'
パスワードは、ファイル内のデータから正常に復号化されています。 chmod
を使用してこのファイルのアクセス許可を変更し、他のユーザーがアクセスできないようにします。
chmod 600 .secret_vault.txt
ls -l .secret_vault.txt
600のアクセス許可マスクを使用すると、ファイル所有者以外のすべてのアクセスが削除されます。 これで、スクリプトの作成に進むことができます。
関連: Linuxでchmodコマンドを使用する方法
スクリプトでのOpenSSLの使用
私たちのスクリプトは非常に簡単です。
#!/ bin / bash #リモートアカウントの名前 REMOTE_USER = geek #リモートアカウントのパスワード REMOTE_PASSWD = $(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass: 'secret#vault!password') #リモートコンピュータ REMOTE_LINUX = fedora-34.local #リモートコンピューターに接続し、script.logというファイルにタイムスタンプを入力します sshpass -p $ REMOTE_PASSWD ssh -T $ REMOTE_USER @ $ REMOTE_LINUX << _remote_commands echo $ USER "-" $(date)>> /home/$REMOTE_USER/script.log _remote_commands
-
REMOTE_USER
という変数を「geek」に設定します。 - 次に、少し前に使用したのと同じコマンドを使用して、
REMOTE_PASSWD
という変数を「.secret_vault.txt」ファイルから取得した復号化されたパスワードの値に設定します。 - リモートコンピューターの場所は、
REMOTE_LINUX
という変数に格納されます。
その情報を使用して、 ssh
コマンドを使用してリモートコンピューターに接続できます。
-
sshpass
コマンドは、接続回線の最初のコマンドです。-p
(パスワード)オプションとともに使用します。 これにより、ssh
コマンドに送信するパスワードを指定できます。 - リモートコンピューターで疑似TTYを割り当てる必要がないため、
ssh
で-T
(疑似端末割り当てを無効にする)オプションを使用します。
ここでは短いヒアドキュメントを使用して、リモートコンピューターにコマンドを渡します。 2つの_remote_commands
文字列の間のすべてが、リモートコンピューター上のユーザーセッションへの指示として送信されます。この場合、これは1行のBashスクリプトです。
リモートコンピューターに送信されるコマンドは、ユーザーアカウント名とタイムスタンプを「script.log」というファイルに記録するだけです。
スクリプトをコピーしてエディターに貼り付け、「go-remote.sh」というファイルに保存します。 自分のリモートコンピューターのアドレス、リモートユーザーアカウント、およびリモートアカウントのパスワードを反映するように詳細を変更することを忘れないでください。
chmod
を使用して、スクリプトを実行可能にします。
chmod + x go-remote.sh
残っているのはそれを試すことだけです。 スクリプトを起動してみましょう。
./go-remote.sh
私たちのスクリプトは無人スクリプトの最小限のテンプレートであるため、端末への出力はありません。 ただし、Fedoraコンピューターの「script.log」ファイルを確認すると、リモート接続が正常に行われ、「script.log」ファイルがタイムスタンプで更新されていることがわかります。
cat script.log
あなたのパスワードは非公開です
リモートアカウントのパスワードはスクリプトに記録されていません。
また、復号化パスワードはスクリプトではありますが、「。secret_vault.txt」ファイルにアクセスして復号化し、リモートアカウントのパスワードを取得することはできません。