authentication とは? あなたが誰であるかを証明する
authentication は1つの問いに答えます。あなたは名乗る通りの存在か? アクセスが許可される前にアイデンティティを検証します。
authentication は、あらゆる安全なシステムの正面玄関です。人、サービス、あるいはパイプラインが何かをする前に、通常は知っているもの・持っているもの・自身であるものを提示して、そのアイデンティティを証明しなければなりません。CI/CD ではこれが絶えず重要になります。パイプラインは GitHub、クラウドプロバイダ、registry に対して認証し、しばしば1回の実行で何十回も、すべて人間がパスワードを打つことなく行います。
3つの要素
- 知っているもの: パスワード、PIN、passphrase。
- 持っているもの: 電話、hardware key、token。
- 自身であるもの: 指紋、顔、その他の生体情報。
authentication は authorization ではない
authentication はアイデンティティを確立し、authorization はそのアイデンティティが何をすることを許されるかを決めます。ログインはあなたが誰かを証明します。本番データベースを削除できるかどうかは、別の authorization の問題です。この2つを混同することは、セキュリティバグのよくある原因です。
マシンはどう認証するか
CI の作業のほとんどは machine-to-machine です。パイプラインはパスワードを打ちません。token、API key、あるいはオンデマンドで発行された短命な認証情報を提示します。受け取る側のサービスがその認証情報を検証し、そのリクエストを信頼するかを決めます。
CI/CD における authentication
1回の workflow 実行は何度も認証します。repo を clone するため、image を push するため、クラウドアカウントへデプロイするため、そして status を報告するため。各ステップが認証情報を必要とし、各認証情報は leak しうるものです。常設の認証情報を最小化すること、たとえば OIDC を使ってジョブごとの token を発行することが、そのリスクを縮小します。
よくある失敗モード
弱いまたは使い回されたパスワード、決して rotate されない長命な token、そして source control に commit された認証情報が、authentication が壊れる通常の道です。パイプラインでは、leak した token は、しばしば広範で自動化されたアクセスを持つため特に危険です。
なぜ runner が重要か
authentication の認証情報は、ジョブを実行するマシンを通過します。共有された長命な runner では、leak した token が居座り、後のジョブに読まれかねません。分離されたエフェメラルな runner(Latchkey のマネージド runner など)は、各ジョブの後に環境を破棄するため、認証情報がそれを使った作業より長く生き残りません。
重要なポイント
- authentication は、アクセスが許可される前にアイデンティティが本物であることを証明する。
- アイデンティティが何をできるかを統べる authorization とは区別される。
- CI/CD ではマシンの authentication が絶え間なく、短命な認証情報が leak リスクを減らす。