Bashスクリプトで暗号化されたパスワードを使用する方法

公開: 2022-01-29
UbuntuスタイルのLinuxラップトップ。
fatmawati achmad zaenuri / Shutterstock.com

Linuxスクリプトを使用してパスワードで保護されたリソースに接続する必要がある場合は、そのパスワードをスクリプトに含めることに不安を感じる可能性があります。 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 (疑似端末割り当てを無効にする)オプションを使用します。
Linux上のBashで「ヒアドキュメント」を使用する方法
Linux上のBashで「ヒアドキュメント」を使用する関連

ここでは短いヒアドキュメントを使用して、リモートコンピューターにコマンドを渡します。 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」ファイルにアクセスして復号化し、リモートアカウントのパスワードを取得することはできません。