オンプレからAWSリソースへ安全にアクセスする

こちらは エキサイトホールディングス Advent Calendar 2021 22日目の記事です。

qiita.com

はじめに

オンプレとクラウドのハイブリッド環境でシステムを運用していると、外部アプリケーションからAWSリソースを操作することが多々あります。脳死で「IAMユーザを作って、クレデンシャル情報を生成して・・・」となりがちだったので、どのような認証手段があるのかを整理しました。

署名バージョン4

IAMユーザのアクセスキー(クレデンシャル情報)を使った認証です。AWS SDKを使えばアプリケーション側も手っ取り早く実装できるので、使っている方も多いはずです。

Signing AWS API requests - AWS Identity and Access Management

が、有効期限の長いクレデンシャル情報を使うことになるので、キー漏洩による不正利用などが問題になりがちです。そのため、クレデンシャル情報のローテーションなどを考える必要があったりします。

セキュリティは軽視できませんし、なるべくならクレデンシャル情報の保存は避けたいところです。

SAMLOpenID Connector

使い回せるような半永続的なクレデンシャル情報ではなく、一時的に都度作成されるものであればリスクを低減できそうです。そこでSAMLOpenID Connector(OIDC)の出番です。GitHub ActionsがOIDCをサポートしたのは記憶に新しいですね。おかげでIAMユーザを作成せずとも、GitHub ActionsのワークフローからAWSリソースを操作できるようになったわけです。

Configuring OpenID Connect in Amazon Web Services - GitHub Docs

大体はこれで解決できそうですが、IdPがSAMLやOIDCに対応していなかったり、そもそもIdPが存在しない場合には新たに構築が必要になります。当然のことながら、SAMLやOIDCの認証プロセスの実装や運用も必要なので、一から作っていくのは骨が折れそうです。

MutualTLS

その他にも、MutualTLS(mTLS)が使えると思います。相互TLS認証とかクライアント認証などとも呼ばれていますね。AWSではAPI GatewayAWS IoT CoreなどでmTLSを設定できます。古くからある認証手段ですので、アプリケーション側も容易に実装できます。

Configuring mutual TLS authentication for an HTTP API - Amazon API Gateway

Client authentication - AWS IoT Core

ただし、証明書のライフサイクル管理が必須、という課題は残ります。また、API GWでは証明書が失効したかどうかについては検証しない*1ため、別途Lambdaオーソライザーなどを挟む必要があります。

おわりに

どれもメリット・デメリットがあります。

手法 メリット デメリット
署名バージョン4 手軽に実装できる クレデンシャル情報が漏洩したときのリスクが大きい
SAML / OIDC 一時的なクレデンシャル情報を用いるのでセキュリティ的に安心 SAMLアサーションやアクセストークンのライフサイクル管理、IdPの管理などが必須
MutualTLS レガシーなシステムでも実装が比較的容易 証明書のライフサイクル管理が手間になる

今回に限った話ではないですが、アプリケーションとの相性やビジネス的な優先度などから使い分けていけると良いかなと思います。

エキサイトではエンジニアを募集しています。募集情報は以下から。

www.wantedly.com