web-dev-qa-db-ja.com

再起動中にhttpsサイトで証明書のパスワードをNginxに渡す

ansible でnginxのインストールと構成を(httpsサイトのSSL証明書のセットアップと共に)構成しました。 SSL証明書はパスフレーズの下にあります。

Nginxを再起動するansilbeタスクを書きたいです。問題は次のとおりです。

通常、内部にhttpsサイトがあるnginxはPEM pass phrase再起動中。 Ansibleは、プレイブックの実行中にそのパスフレーズを要求しません。

ソリューション があり、復号化された証明書とキーをプライベートディレクトリに保存します。しかし、証明書とキーを暗号化されていない場所に残したくありません。

再起動中にansible経由でnginx(またはopenssl)にパスワードを渡す方法は?完璧なシナリオは次のとおりです。

  1. AnsibleがSSLパスワードを要求しています(vars_promt)。別のオプションは、ansible vaultを使用することです。
  2. Ansibleはnginxを再起動しており、nginxがPEM pass phrase、ansibleはnginxにパスワードを渡します。

出来ますか?

18
petRUShka

Nginxには ssl_password_file パラメーターがあります。

fileを指定します。各パスフレーズが個別の行に指定されている秘密鍵のパスフレーズを使用します。キーをロードするときに、パスフレーズが順番に試行されます。

例:

http {
    ssl_password_file /etc/keys/global.pass;
    ...
    server {
        server_name www1.example.com;
        ssl_certificate_key /etc/keys/first.key;
    }
    server {
        server_name www2.example.com;
        # named pipe can also be used instead of a file
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}

ssl_password_fileをansible-vaultに保持し、コピーして、nginxを再起動し、成功したら削除してください。

それが実際に機能するか、これが持つ可能性のある他の副作用(たとえば、手動service nginx restartはおそらく失敗する)の場合、私は直接的な経験はありませんが、それは私にとって論理的なアプローチのようです。

28
Mxx

秘密鍵に対して十分に制限されたアクセス許可がある場合(たとえば、nginxにのみそれを読み取らせる)、これで十分でしょう。とにかく、Nginxはメモリにロードしたままにしておく必要があります。攻撃者が回復するのは難しいかもしれませんが、ボックスへのルートアクセスがある場合は、キーが危険にさらされていることを考慮する必要があります。

または、再起動中のコマンドにパスワードをパイプすることができます(例:echo mypass | service nginx restart)。これにより、プロセスリストにプレーンテキストで表示され、これ以上安全であるとは見なされません。

ファイルのアクセス許可をロックダウンし、パスワードを持たないことをお勧めします。 Ansibleには、Sudo以外の個々のプロンプトへの応答を指定する方法はないと思います。

4
Dan