ラベル Onelogin の投稿を表示しています。 すべての投稿を表示
ラベル Onelogin の投稿を表示しています。 すべての投稿を表示

2024年6月10日月曜日

OAuth2 Proxy と nginx を組み合わせる方法

OAuth2 Proxy と nginx を組み合わせる方法

概要

前回 oauth2-proxy を構築しました
今回はその構築したプロキシを使って nginx と組み合わせてみます

環境

  • Ubuntu 22.04
  • golang 1.22.3
  • oauth2-proxy 7.6
  • nginx 1.18.0

nginx.conf (default) の修正

  • vim /etc/nginx/sites-available/default

最低限設定が必要な箇所だけ紹介します
server ディレクティブを編集します

location /oauth2/location = /oauth2/auth は必須です
そして認証をかけたい部分 (今回だと location /) に auth_request と error_page お記載します

こうすることで / にアクセスされた際に oauth2-proxy に認証させることができます

server {
	listen 80 default_server;
	listen [::]:80 default_server;

	location /oauth2/ {
		proxy_pass       http://localhost:4180;
		proxy_set_header Host                    $host;
		proxy_set_header X-Real-IP               $remote_addr;
		proxy_set_header X-Auth-Request-Redirect $request_uri;
		# or, if you are handling multiple domains:
		# proxy_set_header X-Auth-Request-Redirect $scheme://$host$request_uri;
	}
	location = /oauth2/auth {
		proxy_pass       http://localhost:4180;
		proxy_set_header Host             $host;
		proxy_set_header X-Real-IP        $remote_addr;
		proxy_set_header X-Forwarded-Uri  $request_uri;
	        # nginx auth_request includes headers but not body
	        proxy_set_header Content-Length   "";
		proxy_pass_request_body           off;
	}

	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;
	server_name _;

	location / {
		auth_request /oauth2/auth;
		error_page 401 =403 /oauth2/sign_in;
		try_files $uri $uri/ =404;
	}
}

oauth2-proxy 側は

前回の設定のままで OK です

動作確認

  • sudo systemctl restart nginx

で再起動し localhost にアクセスすると認証ページに移動することを確認します

Tips

nginx は当然アクセスできる必要があるのですが auth2-proxy にもクライアントからアクセスできる必要があります
これはリダイレクト先が auth2-proxy になっているためで auth2-proxy のリダイレクト URL にブラウザからアクセスできないと認証情報が受け取れないためです
なのでクライアントには 80 と 4180 の auth2-proxy のポートも開放する必要があります

最後に

oauth2-proxy と nginx を組み合わせてみました
認証後の情報がバックエンド側のアプリでほしい場合には nginx 側でスルーするヘッダなどを設定しましょう

参考サイト

2024年6月7日金曜日

OAuth2 Proxy を Onelogin で使ってみる

OAuth2 Proxy を Onelogin で使ってみる

概要

oauth2-proxy は nginx や traefik などでホスティングした静的ページに対して認証をつけることができるツールです
今回はとりあえず単体で動かしてみました
また今回紹介する設定は localhost で動作させる設定になります

環境

  • Ubuntu 22.04
  • golang 1.22.3
  • oauth2-proxy 7.6

インストール

  • go install github.com/oauth2-proxy/oauth2-proxy/v7@latest

Onelogin のシークレットの取得

こちらの記事を参考に取得します

localhost.cfg

provider = "oidc"
redirect_url = "http://localhost:4180/oauth2/callback"
oidc_issuer_url = "https://xxxxx.onelogin.com/oidc/2"
upstreams = [
    "http://0.0.0.0"
]
email_domains = [
    "*"
]
client_id = "xxx"
client_secret = "xxx"
pass_access_token = true
cookie_secret = "hTsaC2-8_RVIU4VmTRsC_A=="
cookie_secure = false
skip_provider_button = true
# Note: use the following for testing within a container
http_address = "0.0.0.0:4180"

設定するべき項目は以下です

  • oidc_issuer_url -> Onelogin が発行する OAuth 用の URL を入力します
  • client_id -> Onelogin で取得したクライアントIDを入力します
  • client_secret -> Onelogin で取得したクライアントシークレットを入力します
  • cookie_secret -> クッキーを暗号化するための文字列を取得します

cookie_secret は以下のようなコマンドで推測されにくいランダムな文字列を設定することをオススメします

python -c 'import os,base64; print(base64.urlsafe_b64encode(os.urandom(16)))'

認証後は upstreams に指定している URL の情報が表示されます

oauth2-proxy の起動

  • oauth2-proxy --config ./localhost.cfg

これで localhost:4180 にアクセスすると Onelogin の認証画面になります
認証が成功すると upstreams に設定した URL のコンテンツ情報が表示されます

最後に

OAuth2 Proxy を単体で動作させてみました
まずは単体で動作させてどういう挙動になるのか確認したほうが良いかなと思います

次回は nginx と連携してみます

参考サイト

2023年3月16日木曜日

MinIOでOneloginのOpenIDConnectを使って認証する方法

MinIOでOneloginのOpenIDConnectを使って認証する方法

概要

MinIO にはデフォルトでOpenIDConnectに接続するための機能が実装されています
今回は Onelogin を使って OpenIDConnect 認証できるようにしてみました

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • minio RELEASE.2022-10-24T18-35-07Z

注意事項

gateway モードでは使えません

流れ

  1. MinIO 起動
  2. MinIO にグループのポリシーを追加
  3. Onelogin 側の設定
  4. ログイン

MinIO の起動

まずは MinIO を起動します
今回は docker を使います

ポイントは MINIO_IDENTITY_OPENID_ で始まる環境変数でここに Onelogin の認証情報を登録します

MINIO_IDENTITY_OPENID_CLAIM_NAME は groups という値にしています
これは Onelogin から送られてきたトークンに含まれる groups というフィールドをもとに MinIO 内で使用するポリシーを選択するために使用されます
特定のグループに対するポリシー情報の登録は後ほど行います

リダイレクトURLは http://localhost:9100/oauth_callback を設定します
MinIO には oauth_callback というリダイレクト用の URI が用意されいます
Onelogin の場合 localhost 以外のコールバック URL を指定する場合は https 化が必須なので注意しましょう

docker run --rm -p 9100:9100 -p 9000:9000 --name minio-s3 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=xxx" \
-v ~/minio/data:/data \
-e "MINIO_IDENTITY_OPENID_CLAIM_NAME=groups" \
-e "MINIO_IDENTITY_OPENID_CONFIG_URL=https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration" \
-e "MINIO_IDENTITY_OPENID_CLIENT_ID=xxxx" \
-e "MINIO_IDENTITY_OPENID_CLIENT_SECRET=xxxx" \
-e "MINIO_IDENTITY_OPENID_SCOPES=groups email openid profile" \
-e "MINIO_IDENTITY_OPENID_REDIRECT_URI=http://localhost:9100/oauth_callback" \
quay.io/minio/minio:RELEASE.2022-10-24T18-35-07Z server /data --console-address ":9100"

MinIO にグループのポリシーを追加

MinIO が起動できたらグループに対する MinIO 上で割り当てるポリシーを作成します

ポリシーの割り当てには MinIO 用の mc という CLI ツールを使います

先にポリシー用のファイルを作成します

  • vim allaccess.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

あとはこれと mc コマンドを使って起動した MinIO にポリシーを登録します

  • docker run --name mc -it --entrypoint=/bin/sh minio/mc

mc コマンドコール用のコンテナが起動したらファイルを送ります

  • docker cp allaccess.json mc:/

そしてポリシーを登録します

  • mc alias set myminio http://172.17.0.1:9000 admin password
  • mc admin policy add myminio admin allaccess.json

上記の場合 1. 先程起動した MinIO を myminio という名前で登録 2. myminio の admin グループに allaccess.json のポリシーを登録という流れになります

なのでもし Onelogin から送られてくる groups 情報に admin ではなく別のグループ名が含まれている場合は admin の部分を適当なグループ名に変更してポリシー登録してください

Onelogin 側の設定

Onelogin 側ではコールバック用の URL を追加するくらいかなと思います

詳しい設定方法や認証情報の確認方法は過去に紹介しているのでそちらを参照してください

動作確認ログイン

localhost:9100 にアクセスするとログインボタンが表示されます
クリックすると Onelogin のログイン画面に遷移するのでログインしましょう

トラブルシューティング

おそらく一番目にするのは Policy claim missing from the JWT token, credentials will not be generated というエラーかなと思います
これは Onelogin から送られてきたトークン情報に policy というフィールドがないから MinIO 内で使用するポリシー情報を割り当てられませんというエラーになります

この policy という値をコントロールするのが MINIO_IDENTITY_OPENID_CLAIM_NAME になります
Onelogin では policy フィールドはトークンに含まれていません
なので groups フィールドを使うために MINIO_IDENTITY_OPENID_CLAIM_NAME=gropus にしています

IdP から送られてくるトークン情報をデバッグする方法は以下のコマンドで実行することで確認できます

  • mc admin trace -v -a myminio

WebIdentityToken というフィールドがJSONトークン情報になります
トークン情報はエンコードされているのでデコードして確認してください

最後に

MinIO で OpenIDConnect に接続する方法を紹介しました
IdP 側が送信するトークン情報に応じて対応が少し異なるので注意が必要です
IdP 側から直接ポリシー情報を送信することもできるようです

参考サイト

2023年3月6日月曜日

Gitlab と AzureAD の OpenIDConnect で認証連携する方法

Gitlab と AzureAD の OpenIDConnect で認証連携する方法

概要

前回 AzureAD + SAML 認証を紹介しました
今回は AzureAD + OpenIDConnect の連携方法を紹介します

環境

  • Gitlab 15.6.8-ee
  • AzureAD (2023/03/02 時点)

アプリケーションの登録

まずは Azure AD にアプリケーションを登録します

ディレクトリのトップ画面に移動します

そして左メニューから「アプリの登録」を選択し「新規登録」します

アプリの名称を入力します
そして重要なリダイレクトURIを入力します
リダイレクト URI「Web」を選択し Gitlab の URL + /users/auth/openid_connect/callback を入力します

エンドポイントとクライアントIDの確認

アプリケーションが作成できたら「エンドポイント」を選択し OpenIDConnect 用のエンドポイントを確認します

またアプリケーションの詳細画面に「アプリケーション(クライアントID)」があるのでこれもメモしておきます

シークレットの作成

次にシークレット情報を作成します
左メニューの「証明書とシークレット」を選択し「新しいクライアントシークレット」を選択します

説明とシークレットの有効期限を設定しましょう
シークレットの有効期限は無限にはできないですが日付指定はできるのでそれを使って期間を延長しましょう

使用するのはシークレットIDではなく値の方になります

その他

  • アプリケーションへのユーザの登録は必要に応じて行う
  • トークン構成から email 情報を追加する必要はなさそう

gitlab.rb の編集

作成したアプリケーションの情報を展開します
編集する箇所は以下の通りです

  • issuer・・・アプリケーションのエンドポイントで確認した OpenIDConnect 用の URL を記載
  • client_options.identifier・・・アプリケーションのクライアントIDを記載
  • client_options.secret・・・アプリケーションに作成したシークレットの値情報を記載
  • client_options.redirect_uri・・・アプリケーション作成時に登録したリダイレクトURIを記載
gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = false
gitlab_rails['omniauth_providers'] = [
  {
    name: "openid_connect",
    label: "Azure OIDC",
    args: {
      name: "openid_connect",
      scope: ["openid", "profile", "email"],
      response_type: "code",
      issuer:  "https://login.microsoftonline.com/xxxxxxxxxxxx/v2.0",
      client_auth_method: "query",
      discovery: true,
      uid_field: "preferred_username",
      pkce: true,
      client_options: {
        identifier: "xxxxxxxxxxxx",
        secret: "xxxxxxxxxxx",
        redirect_uri: "https://your.gitlab.com/users/auth/openid_connect/callback"
      }
    }
  },
]

動作確認

あとは reconfigure してログインページから Azure OIDC でログインできるか確認しましょう

初回アクセス時にはアプリケーションからのアクセス許可が必要なので許可しましょう

最後に

Gitlab + AzureAD + OpenIDConnect の連携方法を紹介しました
Gitlab と AzureAD の認証連携をする場合には SAML or OpenIDConnect を選択できます
基本は SAML で OK ですが用途に合わせては OpenIDConnect を使うのもありかなと思います

この辺りの認証情報の取捨選択は環境に合わせて選択する必要があります

参考サイト

2023年3月5日日曜日

Python で OpenIDConnect を使って認証する方法

Python で OpenIDConnect を使って認証する方法

概要

Python の authlib を使えば簡単に OpenIDConnect を使った認証機能を Web アプリケーションに追加することができます

今回は Flask + authlib を使って Onelogin の OpenIDConnect に接続して認証を追加してみました

環境

  • macOS 11.7.4
  • Python 3.10.2
  • authlib 1.2.0
  • Flask 2.2.3

Onelogin 側の設定

OIDC アプリを作成してユーザの追加やリダイレクトURIの設定をしておきましょう
リダイレクトURIは今回は localhost で動作させるので「http://localhost:5000/callback」 を追加しておきましょう

あとはコードに必要になる「Client ID」「Client Secret」「Issuer URL」あたりをコピーしておきます

サンプルコード

  • vim app.py
from flask import (Flask,
                   url_for,
                   session,
                   redirect)
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = "xxx"
app.config["ONELOGIN_CLIENT_ID"] = "xxxx"
app.config["ONELOGIN_CLIENT_SECRET"] = "xxxx"

oauth = OAuth(app)
oauth.register(
  name="onelogin",
  server_metadata_url="https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration",
  client_kwargs={"scope": "openid email profile"}
)


@app.route("/")
def homepage():
    user = session.get("user")
    if user is None:
      return redirect("/login")
    return f"user => {user}"


@app.route("/login", methods=["GET"])
def login():
    redirect_uri = url_for("auth", _external=True)
    return oauth.onelogin.authorize_redirect(redirect_uri)


@app.route("/callback")
def auth():
    token = oauth.onelogin.authorize_access_token()
    session["user"] = token["userinfo"]
    return redirect("/")


@app.route("/logout")
def logout():
    session.pop("user", None)
    return redirect("/")

設定を変更するのは ONELOGIN_CLIENT_ID, ONELOGIN_CLIENT_SECRET, server_metadata_url です

動作確認

  • pipenv run flask run

でブラウザで localhost:5000 にアクセスすると onelogin のログイン画面になるのでそこでログ人すれば OK です

最後に

Python の authlib を使って OpenIDConnect 認証を追加する方法を紹介しました
OpenIDConnect 自体 OAuth2 のラップなので認証方法はほぼ OAuth2 と同じになります

参考サイト

2023年3月2日木曜日

GitlabでOneloginとSAML連携する際のポイント

GitlabでOneloginとSAML連携する際のポイント

概要

Gitlab + Onelogin で SAML 認証連携する際のいくつかのポイントを紹介します

環境

  • Gitlab-ee 15.6.7
  • Onelogin 2023/03/01 時点

Onelogin 側の設定

Configuration

ここでは gitlab 側の設定を記載します

  • Audience・・・Onelogin 側が払い出す Issuer の URL を記載します
  • Recipient・・・Gitlab の URL + SAML 用のコールバック URL を記載します
  • ACS URL Validator・・・Recipient で指定した Gitlab の URL の正規表現版を記載します
  • ACS URL・・・Recipient で指定した Gitlab の URL を記載します
  • Login URL・・・Gitlab のログイン URL を記載します

上記以外はすべてデフォルトのままで OK です

SSO

gitlab.rb に記載する情報を確認できます
使用する情報は

  • X.509 Certificates の SHA1 フィンガープリント情報 (View Details から確認可能)
  • Issuer URL
  • SAML 2.0 Endpoint

になります

Parameters

SAML 認証時にメールアドレスの情報を送信するようにします
プラスボタンから追加しましょう

  • name・・・email
  • value・・・Email

その際に「Include in SAML assertion」には必ずチェックするようにしてください

これのチェックがないと「422 Email can't be blank, Notification email can't be blank」のエラーになります

user の追加

作成した SAML アプリにログインを許可するユーザを追加しましょう
ロールを追加しても OK です

gitlab.rb

上記の情報を含めて gitlab.rb の内容を記載します

記載する情報は以下の通りです

  • assertion_consumer_service_url・・・Gitlab の URL + コールバック URL
  • idp_cert_fingerprint・・・SSO で確認した X.509 Certificates の SHA1 フィンガープリント情報
  • idp_sso_target_url・・・SSO で確認した SAML 2.0 Endpoint
  • issuer・・・SSO で確認した Issuer URL
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml_3']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = false
gitlab_rails['omniauth_providers'] = [
  {
    name: 'saml_3',
    label: 'Onelogin',
    args: {
      name: 'saml_3',
      assertion_consumer_service_url: 'https://your.gitlab.com/users/auth/saml_3/callback',
      idp_cert_fingerprint: 'xxxxxxxxxxxxxxx',
      idp_sso_target_url: 'https://xxxxxxx.onelogin.com/trust/saml2/http-post/sso/xxxxxxxxxxx',
      strategy_class: 'OmniAuth::Strategies::SAML',
      issuer: 'https://app.onelogin.com/saml/metadata/xxxxxxxxxxxxx',
      name_identifier_format: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress'
    }
  },
]

動作確認

あとは reconfigure してログインページから onelogin のユーザでログインできるか確認すれば OK です

最後に

Gitlab + Onelogin の情報があまりネット上にはないのでこの記事が他の人の役に立てばいいかなと思います

2018年8月17日金曜日

Onelogin を試してみた

概要

Onelogin は Onelogin 社が提供する IDaaS (Identity as a Service) です
フリートライアルであれば無料で使えるので試してみました
登録方法から紹介します

環境

  • macOS 10.13.6
  • Onelogin (2018/08/09 時点)

フリートライアルで登録する

このページから登録しましょう
必要な情報を入力して登録します
フリートライアル中は使える機能が制限されています
onelogin1.png

登録するのに「企業ドメインのメールアドレス」が必要になります
要するに @gmail.com などは使えません
試しにやってみましたがエラーになりました
おそらく簡単なチェックしかしていないので自分はメールサーバを立てて自分のドメインを割り当てて、そのメールアドレスで登録しました
おそらくここが一番の難関かもしれません

すぐに管理者のパスワードを設定する画面になるのでパスワードを設定しましょう

パスワードの設定が完了しログインすると以下のような画面になります
onelogin2.png

Onelogin 用の ChromeExtension をインストールする

「INSTALL ON CHROME」を選択して素直にインストールしましょう
onelogin3.png

アプリを登録する

次にアプリをインストールしてみましょう
Onelogin の場合アプリを登録するのは対象のサイトに行くだけで OK です
onelogin4.png

今回は Twitter アプリをインストールしてみます
ブラウザでそのまま Twitter のサイトに行ってログインしましょう
すると Onelogin のエクステンションが反応してアプリを追加するかダイアログが表示されます
onelogin5.png

個人かドメインどちらにアプリをインストールするか聞かれるので今回はドメインに対してインストールしました
ドメインに対してインストールするとドメインに属するすべてのユーザがアプリを使えるようになります
onelogin6.png

ユーザを追加する

最後にユーザを追加します
ユーザの追加は ActiveDirectory などの IDP からインストールすることができます
また手動で追加することもできます
onelogin7.png

ActiveDirectory 連携はトライアル期間では使用できませんでした
onelogin8.png

今回は手動で 1 人追加してみました
同一企業ドメインでのメールアドレスが必要になるので作成しましょう
onelogin9.png

メールアドレスや企業名、マネージャなどは不要でした
あとは「MORE ACTIONS」から「Send Invitation」を選択しましょう
すると招待メールが届くはずです
onelogin10.png

メールに記載のアドレスにアクセスするとパスワードの設定画面になるので設定しましょう
onelogin11.png

これで新規ユーザの登録は完了です
ログイン画面が出るのでログインできるか確認しましょう
ログインできれば新規ユーザのアプリ一覧が表示されます
onelogin12.png

まだ何もアプリがない場合はアプリを使えるようにアプリに対してユーザを追加する必要があります
ユーザをアプリが使えるように追加する手順は次に紹介します

ユーザにアプリを追加する

スコープをドメインレベルで追加したアプリはユーザを追加することで使えるようになります
「Users」->「All Users」でユーザの一覧を表示します
そしてアプリを追加するユーザを選択します
ユーザの設定画面から「Applications」を選択します
onelogin13.png

「+」ボタンを押すとドメインに登録したアプリの一覧がプルダウンから選択できます
今回は先ほど登録した Twitter アプリを選択し「CONTINUE」します
すると Twitter の認証情報を登録する画面になります
今回はユーザに認証情報を登録させたいので何も入力せずに次に進みます
onelogin15.png

これでユーザ側のポータル画面を見ると先ほどなかったアプリが追加されているのが確認できると思います
onelogin16.png

これでユーザがアプリを選択すると先ほど設定していなかった ID/PW を設定することができます

オプション機能

https://www.onelogin.com/product/pricing

今回はトライアルなので基本的な機能しか使えません
onelogin18.png

UNLIMITED (月ユーザ一人あたり 8 ドルのプラン) に申し込めばすべての機能が使えるようになります
onelogin17.png

例えば SAML 認証と連携したい場合は「Custom Connectors」が使えないとダメです
なので最低でも「Enterprise」プランの申込みが必要です

OpenID Connect のエンドポイントもあるようでこれであればトライアルプランでも使えるかもしれません

最後に

Onelogin のトライアルを試してみました
基本的な操作はブラウザエクステンションを導入して各サイトの ID/PW をガンガン記憶されていく感じです
ユーザの追加などはトライアルだと手動でやるしかありません

機能は IDaaS の中でもかなり豊富な方だと思います
が、使用するには有料のプランに申し込む必要があるので個人用途の検証レベルだと厳しいかなと思います
1 ヶ月だけということであればまぁ何とかなるかなと思います

UI はかなり操作しやすかったです
インタフェースは UI 以外に API もあるので自動化もできると思います

参考サイト