これまで、Soliton OneGate(以下、OneGate)を使って AWS Application Load Balancer(以下、ALB)をセキュアにする方法として、「SSLオフロード」や「mTLS認証」を紹介しました。



mTLS認証は強力ですが、近年では「端末」だけでなく「ユーザー本人」の確認や、アクセスの状況に応じた柔軟な制御が求められています。
そこで今回は、2025年秋のアップデートでOneGateが対応した 「OIDC認証」 を利用し、ALBの認証をより強固なものにする構成を紹介いたします。
「OneGateから発行したクライアント証明書で、許可された端末以外はブロックできているから十分では?」
そう思われる方も多いかもしれません。この構成ならOneGateのPKIプランで比較的安価に構築できます。
端末認証は強力ですが、OneGate Basicプラン以上で使えるOIDC認証を組み合わせることで、認証の「質」 が変わるメリットがあります。
ALBの認証をOneGateに向けることによるメリットは次の通りです。
ALBとOneGateを認証連携させる環境を構築します。 AWS上にWebサーバーを構築してALB経由でアクセスする手段は以前ご紹介した通りですので割愛します。 ALBの構築手順についてはOneGateから発行した証明書を使ってAWS ALBをセキュアにする-その1「SSLオフロード」をご参照いただければと思います。
ALBでOIDC認証する場合、ALBにOIDCの認証連携の設定を入れる方法とOIDC認証が設定されているCognitoをブローカーとして使う方法があります。
それぞれのメリット・デメリットを簡単にまとめてみました。
| 特徴 | ALBに直接OIDC設定する | Cognitoをブローカーにする |
|---|---|---|
| 構成の複雑さ | シンプル(ALBとOneGateのみ) | 要素が増える(ALBとOneGateとCognito) |
| AWSのコスト | ALBの料金のみ | ALBとCognitoの料金がかかる |
| ユーザー情報の扱い | ALBはユーザー情報を永続的には保持せず、セッション情報のみを管理します | Cognitoユーザープールに情報が保存される |
| AWSの他のサービスとの連携 | Webサーバーにヘッダー情報を渡すのみ | API GatewayやIAMなどと連携が可能 |
| 複数のIdP(認証サーバー)利用 | 不可 | 可能 例)社員はSoliton OneGate、協力会社は他のIdPなど、複数のIdPを使用することが可能 |
今回の構成ではALBが提供するOIDC認証機能の動作確認を目的としますので、Cognitoは使用せずにシンプルにALBに直接OIDC設定を行うようにします。
本記事の検証構成は次の通りです。
今回はALBの認証機能を検証する目的のため、下記のように簡素化した構成にしてあります。
<参考:Amazon Linux 2023にNginxをインストール>
# パッケージの更新とNginxインストール
sudo dnf update -y
sudo dnf install nginx -y
# 起動と自動起動設定
sudo systemctl enable --now nginx
# 状態確認(Active: active (running) ならOK)
systemctl status nginx
<参考:ap-northeast-1aのAL2023 Webページサンプル>
sudo sh -c 'cat <<EOF > /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ALB Test - Server 1</title>
<style>
body {
background-color: #E3F2FD; /* 薄い青 */
color: #0D47A1;
font-family: sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.card {
background: white;
padding: 2rem;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
text-align: center;
}
</style>
</head>
<body>
<div class="card">
<h1>Server 1 🔵</h1>
<p>This response is from the <strong>FIRST</strong> instance.</p>
<p>Target Group Health Check: OK</p>
</div>
</body>
</html>
EOF'
<参考:ap-northeast-1cのAL2023 Webページサンプル>
sudo sh -c 'cat <<EOF > /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ALB Test - Server 2</title>
<style>
body {
background-color: #E8F5E9; /* 薄い緑 */
color: #1B5E20;
font-family: sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.card {
background: white;
padding: 2rem;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
text-align: center;
}
</style>
</head>
<body>
<div class="card">
<h1>Server 2 🟢</h1>
<p>This response is from the <strong>SECOND</strong> instance.</p>
<p>Target Group Health Check: OK</p>
</div>
</body>
</html>
EOF'
OneGateでサービス連携設定を行います。

| 項目 | 値 |
|---|---|
| クラウドサービス名 | SSO設定名です。任意の値を入れます。 例)ALB-OIDC認証 |
| クラウドサービスの概要 | SSO対象のクラウドサービスの説明を入力します。空欄でも問題ございません。 ALB配下のWebアプリアクセス用 |
| 備考 | クラウドサービスについての説明の補足等を入力します。空欄でも問題ございません。 |
| 項目 | 値 |
|---|---|
| SAML設定 | 「SAMLを使用する」のチェックを外します |
| 項目 | 値 |
|---|---|
| OpenID Connect設定 | 「 OpenID Connectを使用する」のチェックを入れます |
| リダイレクトURI | https://ALBのDNS名/oauth2/idpresponseを入力します。注意:ALBの設定名に大文字が含まれている場合は、リダイレクトURLではすべて小文字にします。 |
| 項目 | 値 |
|---|---|
| 署名アルゴリズム | RS256 |


| 項目 | 値 |
|---|---|
| SSO | プルダウンメニューから「SSO先として利用する」を選択します。 |
| セキュリティレベル | チェックをオフにします。 |
| IdP証明書 | メニューアイコン(≡)をクリックして「Current Certificate」を選択します。 |
| 認証タイプ | 「OpenID Connect」が選択された状態にします。 |
| 項目 | 値 |
|---|---|
| ユーザー名 | 任意のSSO User Xを選んでください。 |
| クライアントID | 表示されている値をコピーして、保存しておきます。 この値はALBの設定変更時に使用します。 |
| クライアントシークレット | 「発行」ボタンをクリックして、生成された値をコピーして保存しておきます。 この値はALBの設定変更時に使用します。 |


OneGateのユーザーに作成したサービス連携設定の利用許可(アプリケーションロール)を与えます。
今回は、あらかじめ作成してあるテストユーザー「alb-user01」に設定する手順を紹介します。
手動での新規登録、ADやEntra ID連携、CSVによる一括登録・変更についてはSoliton OneGate管理者ガイドをご参照ください。




ALBからOneGateにOIDC認証連携するように設定変更します。

| 項目 | 値 |
|---|---|
| アイデンティティープロバイダー | OIDC(OpenID Connect) |
| 発行者 | OneGate管理ページの「OpenID Providerメタデータ」に表示されていた「発行者」の値を入力します。 |
| 認証エンドポイント | OneGate管理ページの「OpenID Providerメタデータ」に表示されていた「認可エンドポイントのURL」の値を入力します。 |
| トークンエンドポイント | OneGate管理ページの「OpenID Providerメタデータ」に表示されていた「トークンエンドポイントのURL」の値を入力します。 |
| ユーザー情報エンドポイント | OneGate管理ページの「OpenID Providerメタデータ」に表示されていた「ユーザー情報エンドポイントのURL」の値を入力します。 |
| クライアントID | クラウドサービス連携設定で控えていたクライアントIDを入力します。 |
| クライアントのシークレット | クラウドサービス連携設定で生成し控えていたクライアントシークレットを入力します。 |

| 項目 | 値 |
|---|---|
| スコープ | 「openid profile」にします。 |

設定が完了したら、実際にALBにアクセスしてみます。






上記のようにALBにアクセスして、OneGateにリダイレクトされて認証して、Webアプリが表示されるまでの流れについて、ブラウザの開発ツールを使って中身の流れを確認してみます。





この流れをフロー図にすると以下になります。
なおクッキーの詳細は次の通りです。
Set-Cookie: AWSELBAuthSessionCookie-0=; Max-Age=0;のようなヘッダーを作って、ブラウザに保持されているAWSELBAuthSessionCookie-xクッキーを期限切れで上書きするなどの処理を検討してください。序盤でALBの認証をOneGateに向けることのメリットの一つとして認証のオフロードによるアプリケーション連携としてHTTPリクエストヘッダーを説明しましたが、ALBからターゲットグループのWebサーバーにどのようなHTTPリクエストヘッダーが渡されるかを確認します。 Application Load Balancer を使用してユーザーを認証する-ユーザークレームのエンコードと署名の検証によると、ALBが下記3つを付与してターゲットグループに転送すると書いてあります。
今回はALBからターゲットグループへはHTTP(TCP/80)と平文での通信であるので、Webサーバー上で下記のようにパケットキャプチャを取得してみて、OneGateで認証した端末がWebアクセスするとALBからどのようなヘッダーが飛んでくるか確認してみます。
sudo tcpdump -i any -A port 80 | grep -i "x-amzn-oidc" [ec2-user@netattest-web ~]$ sudo tcpdump -i any -A port 80 | grep -i "x-amzn-oidc"
tcpdump: data link type LINUX_SLL2
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
X-Amzn-Oidc-Data: eyJ0eXAiOij<中略>AyNTc1NDR9.eyJzdWIiOi<中略>MuanAifQ==.ow8C4i0pPx<中略>EvpWhsqA==
X-Amzn-Oidc-Identity: 54366
X-Amzn-Oidc-Accesstoken: znrS4X<中略>5J0UE8
※セキュリティの都合で一部省略しました。
さて、ユーザーを識別できる情報としてはx-amzn-oidc-identityがありますが、あまり見覚えのない数値データとなっています。
そこで、まずはx-amzn-oidc-dataの中身を確認して、ユーザーを識別できる情報があるか確認してみます。
このヘッダーはOneGateから取得したユーザークレーム、つまりOIDC認証したユーザーの詳細になります。
eyJ0eXAiOij<中略>AyNTc1NDR9.eyJzdWIiOi<中略>MuanAifQ==.ow8C4i0pPx<中略>EvpWhsqA==この値はJWT(JSON Web Token)であり中身はbase64URLエンコードされたJSONデータであるため、Linux環境によってはbase64 -dでデコードできます。
ただしJWTの値を見ると.(ドット)が含まれています。これはJWTがドット区切りでヘッダー.ペイロード(クレームの中身).署名で構成されていますので、クレームの中身だけをみるには
echo "<x-amzn-oidc-dataの値>" | cut -d "." -f 2 | base64 -dのように1つ目のドットと2つ目のドットの間だけをbase64でデコードする必要があります。
[ec2-user@netattest-web ~]$ echo "eyJ0eXAiOij<中略>AyNTc1NDR9.eyJzdWIiOi<中略>MuanAifQ==.ow8C4i0pPx<中略>EvpWhsqA==" | cut -d "." -f 2 | base64 -d
{"sub":"54366","given_name":"User01","family_name":"ALB","zoneinfo":null,"locale":null,"exp":1770257544,"iss":"https://<Soliton OneGate>"}
[ec2-user@netattest-web ~]$
※姓、名に全角カナを含ませた場合、JWTとbase64の仕様の差(パディング数、使う記号)でうまくデコード出来ない場合があります。その場合にはpythonを使って
echo "<x-amzn-oidc-dataの値>" | cut -d "." -f 2 | python3 -c "import sys, base64; print(base64.urlsafe_b64decode(sys.stdin.read() + '===').decode('utf-8'))"を試してみてください。
さて、デコードされた値は次のとおりでした。(JSON部分が見やすいように改行を入れました)
{
"sub": "54366",
"given_name": "User01",
"family_name": "ALB",
"zoneinfo": null,
"locale": null,
"exp": 1770257544,
"iss": "https://<Soliton OneGate>"
}
| 項目 | 値 | 説明 |
|---|---|---|
| sub | 54366 | 認証プロバイダ(今回はSoliton OneGate)上でユーザーを一意に識別するためのIDになります。x-amzn-oidc-identityの値もこれになります。 |
| given_name | User01 | OneGateで設定した名(First Name)の値になります。 |
| family_name | ALB | OneGateで設定した姓(Last Name)の値になります。 |
| iss | https://<Soliton OneGate> | IDトークンの発行者 |
| exp | 1770257544 | IDトークンの有効期限(UnixTime) |
subの値はOneGateの内部で管理している値のためOneGateの管理画面等では見ることが出来ない値ですが、ログ転送を有効にしてTLS通信のSyslogサーバーにログを転送すると、OIDCによる認証を行ったときのSSOアクセスログ("log_type":"sso_access")にemployee_idとして表記されています。
2026-02-05T02: 07: 37+09: 00 OneGate idp {
"timestamp": "2026-02-05T02:07:37.335+00:00",
"tenantcode": "テナント名",
"log_level": "INFO",
"log_type": "sso_access",
"message": "Access Permission",
"params": {
"employee_id": 54366,
"cloud_service_id": 15071,
"ip_address_text": "xxx.xxx.xxx.xxx",
"service_ip_address_text": "xxx.xxx.xxx.xxx",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
"success_flag": true,
"saml_log": null,
"office365_auth_type": 2
}
}
さて、Webアプリ側でHTTPリクエストヘッダーを用いた認証を実装した場合にヘッダーの情報だけでうまくユーザーを一意に識別することができるのでしょうか?
今のままではHTTPリクエストヘッダーの認証に使用するのは難しそうですので、OneGateの管理画面上でも見れる別の値(ログイン名やSSO User X)をIDトークンに含ませたいと思います。
IDトークンのクレームに含ませる方法はprofileと同じくスコープで指定します。ALBで指定することができるスコープはemail、name、openid、postal_code、profile、public_profileとなりますので、ここではnameを追加します。

| 項目 | 値 |
|---|---|
| スコープ | 「openid profile name」にします。 |

この設定でALB側はIdPに対してnameの値をIDトークンに含めるように要求します。
これで再度ALBで認証してみて、パケットキャプチャしてみます。
[ec2-user@netattest-web ~]$ sudo tcpdump -i any -A port 80 | grep -i "x-amzn-oidc"
tcpdump: data link type LINUX_SLL2
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
X-Amzn-Oidc-Data: eyJ0eXAiOi<中略>AyNzAxNTh9.eyJzdWIiOi<中略>lzLmpwIn0=.y84ZHvj3z1<中略>4Y92mfgw==
X-Amzn-Oidc-Identity: 54366
X-Amzn-Oidc-Accesstoken: 1B634J3Obj<中略>vNQuRz7FjQ
^C7 packets captured
9 packets received by filter
0 packets dropped by kernel
[ec2-user@netattest-web ~]$ echo "eyJ0eXAiOi<中略>AyNzAxNTh9.eyJzdWIiOi<中略>lzLmpwIn0=.y84ZHvj3z1<中略>4Y92mfgw==" | cut -d "." -f 2 | base64 -d
{"sub":"54366","given_name":"User01","family_name":"ALB","preferred_username":"albUser01","zoneinfo":null,"locale":null,"exp":1770270158,"iss":"https://<Soliton OneGate>"}
[ec2-user@netattest-web ~]$
こちらもJSON部分が見やすいように改行を入れて表示しました。
{
"sub": "54366",
"given_name": "User01",
"family_name": "ALB",
"preferred_username": "albUser01",
"zoneinfo": null,
"locale": null,
"exp": 1770270158,
"iss": "https://<Soliton OneGate>"
}スコープにnameを追加したところ、SSO User Xで設定した値をpreferred_usernameとしてIDトークンに含めることができましたので、preferred_usernameを使ってWebアプリ側でHTTPリクエストヘッダーを用いて認証するのもよいかもしれません。
また最近のクラウドサービスではemail属性を使うことが多いと思います。OneGate利用者にemailを設定している場合には、ALBリスナーのスコープ設定にemailを入れると、emailの値もクレームに含めることができます。
リスナーのスコープ設定
OneGate利用者のメールアドレス設定
[ec2-user@netattest-web ~]$ sudo tcpdump -i any -A port 80 | grep -i "x-amzn-oidc"
tcpdump: data link type LINUX_SLL2
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
X-Amzn-Oidc-Data: eyJ0eXAiOi<中略>AzMzk1MDJ9.eyJzdWIiOi<中略>N5cy5qcCJ9.MjyKPJG256<中略>7ndxA2CQ==
X-Amzn-Oidc-Identity: 54366
X-Amzn-Oidc-Accesstoken: ZoFQYgWMlv<中略>pMk6FfFY25
^C71 packets captured
73 packets received by filter
0 packets dropped by kernel
[ec2-user@netattest-web ~]$ echo "eyJ0eXAiOi<中略>AzMzk1MDJ9.eyJzdWIiOi<中略>N5cy5qcCJ9.MjyKPJG256<中略>7ndxA2CQ==" | cut -d "." -f 2 | base64 -d
{"sub":"54366","given_name":"User01","family_name":"ALB","preferred_username":"sso-albUser01","zoneinfo":null,"locale":null,"email":"alb-user01@sog.example","email_verified":true,"exp":1770339502,"iss":"https://<Soliton OneGate>"}
こちらもJSON部分が見やすように改行を入れてみました。
{
"sub": "54366",
"given_name": "User01",
"family_name": "ALB",
"preferred_username": "sso-albUser01",
"zoneinfo": null,
"locale": null,
"email": "alb-user01@sog.example",
"email_verified": true,
"exp": 1770339502,
"iss": "https://<Soliton OneGate>"
}
この他、OneGateでは「カスタムクレーム」の機能を使って、OneGate利用者の任意の属性をRP(今回の構成ではALB)が対応している任意のクレーム属性として使用することができます。
利用できる属性や、カスタムクレームの設定方法についてはOneGate管理ガイドをご参照ください。
さて、ここまでHTTPリクエストヘッダーにユーザーを識別する属性値を含められることを紹介しましたが、HTTPリクエストヘッダーを使った認証ではセキュリティ面で意識していただきたい点があります。
HTTPリクエストヘッダーを使った認証ではWebアプリケーションがどこからアクセスされているか? が大変重要になります。もし悪意ある人がALB以外の経路でWebアプリケーションにアクセスしてしまうと、ヘッダーを偽装して別人になりすましてWebアプリにアクセスすることが可能になってしまいます。
それを防ぐためにAWSならびにWebアプリケーション側で下記の点をご考慮いただければと思います。
HTTPリクエストヘッダーを用いた認証に使う物としてx-amzn-oidc-dataを解説しましたので、残り2つを簡単に説明します。
今回、説明のために検証用のWebサーバー上でtcpdumpを実行し、x-amzn-oidc-accesstokenも含めて値を確認しました。 しかし、本番運用中のシステムでこれを行う際は十分にご注意ください。 パケットキャプチャやWebサーバーのログにアクセストークンを記録してしまうと、それらが漏洩した際にシステムへ多大な影響を与えるリスクがあります。(あくまでも検証環境や開発環境でのみで実施してください。)
ここまでHTTPリクエストヘッダーについて解説しました。Webアプリ側にx-amzn-oidc-dataを処理する機構を実装する手間を考えると、一見するとWebアプリケーション側で独自の認証を実装する方が簡単に見えるかもしれません。 しかし、Webアプリ側で認証の仕組みを自作するには、次のような課題が伴います。
これらの要件をすべて外部のIdPに任せることで、Webアプリケーション側での開発・運用工数削減が見込めます。
認証をOneGateへオフロードさせるとOneGateの豊富な認証方法を利用することができます。
OneGateの認証方法の選択
これらの認証方法を自前で実装するとなると莫大な工数がかかる
これらの認証方式にプラスして、下記のような運用を行うことも可能です。






ALBでのOIDC認証連携とOIDC認証したときのクッキーやHTTPアクセスヘッダーに含まれる内容を中心に説明しましたが、改めてALBとOneGateを組み合わせた場合のメリットを説明いたします。
セキュリティの高度化と、ユーザーの利便性・運用の効率化の両立。 一見トレードオフになりがちなこれらを両立するソリューションとして、「AWS ALB × Soliton OneGate」 の組み合わせをぜひご検討いただければ幸いです。