ブログの展開を自動化しようとしています。
ほとんどのCIプロバイダーはLinuxで仮想マシン/ Dockerコンテナーを使用しているので、シェルスクリプトとSSHについて学習しています。
完成したサイトをCIサーバーからWebサーバーにデプロイするために、次のようにSSH経由で接続しています。
rsync -rSlh --stats build/ [email protected]:/www/htdocs/blah/tar
ssh -o StrictHostKeyChecking=yes [email protected] 'bash -s' -- < deploy.sh /www/htdocs/blah/
(複数のブログ投稿とチュートリアルからコピーして貼り付けたコード)
認証は、SSH公開/秘密鍵ペアを介して行われます。
SSHキーで認証しているように見えますが、ユーザー名は引き続き必要です(上のコードの両方の行には[email protected]
)。
上記のコードが最終的にBitbucketのパブリックリポジトリに配置されることを前提とします(これが私のブログのソースコードがある場所だからです):
セキュリティ面で、SSHユーザー名の公開は問題でしょうか?
それを秘密のように扱うべきかどうかわからない。
一方では、実際の認証はSSHキーを介して行われるため、ユーザー名は「それほど重要ではありません」。一方、今では誰もが私のユーザー名を知っており、私のパスワードを総当たり攻撃する可能性があります。
上記の答えは素晴らしいですが、もう1つの単純なオプションを追加したいと思います。
ほとんどのCIプロバイダーには、ビルドスクリプトで参照できる「変数」を格納する方法もあります。実際の例を選ぶと、bitbucketには「変数」があり、それらをいくつかのレベル(たとえば、リポジトリレベルまたはブランチレベル)で構成できます。したがって、SSH_USERNAME
という名前の変数を作成することを想像できます。デプロイスクリプトでは$SSH_USERNAME
を参照し、bitbucketがスクリプトを実行すると、変数に設定したすべてのものがそれに入力されます。これには2つの利点があります。
確かに、これは上記の#2の最適なユースケースではありませんが(この特定のケースでは、すべての環境で一貫したユーザー名を使用する方が良いでしょう)、これが役立つだけでなく必要な場合も多くあります。
これは、必要に応じてユーザー名を隠す方法の1つを示しています。私がここにいる間、私はあなたの質問にも答えるかもしれません。それはやる価値がありますか? @psosunaに同意します。明確にするために、鍵ベースの認証を使用している限り、鍵の保護はユーザー名の保護よりもはるかに重要です。キーがないと、ユーザー名は実質的に価値がなくなります。その結果、ユーザー名を非表示にすることはそれほど重要ではありません。
ただし、スクリプトで変数を既に使用している場合は、個人的にユーザー名を変数に追加します。必ずしもセキュリティが大幅に向上するわけではありませんが、実行するのは非常に簡単であり、将来の人生は少しでも楽になります。
一方、今では誰もが私のユーザー名を知っており、私のパスワードを総当たり攻撃する可能性があります。
最後のすべてに同じユーザー名を使用しないと仮定すると、SSHの場合に実行したいことは、資格情報ベースの認証を許可しないことです。 SSHは、資格情報が正しい場合でも資格情報を受け入れないように構成できるため、代わりにキーベースの認証を使用する必要があります。
このため、キーveryを非常に秘密にしておく必要があります。ユーザー名は、認証方法ほど重要ではありません。
セキュリティを強化するために、キーを使用してシェルセッションでユーザーを認証する前に、キーを認証するための「パスフレーズ」を追加することもできます。
しかし、symcbeanがコメントで述べたように、内部で何かをデバッグしているのでない限り、StrictHostKeyChecking = noは不可です。
そこでユーザー名を設定せずに、sh構成に移動することができます。
.ssh/configファイルの場所:
Host example.com
User my-ssh-user
上記のexample.comだけを使用してください。
さらに、blogmachine
などの別の名前をエイリアスとして使用することもできます。
Host blogmachine
User my-ssh-user
HostName example.com
実際にexample.com
に接続します