やりたいこと
自宅ネット環境がよろしくなく、宅内に立てたNextCloudくんにアクセスできない。
#マンションタイプ、LAN配線方式のためIP固定やポート開放などこちら側でできない。

作った構成はこんな感じ。VPNには、Wireguardを使った。
Linuxカーネルに統合もされてるし、速度もじゅうぶんすぎるくらい出る。
VPNサーバー兼SSO SPサーバーとして外部VPSを使っている。
宅内がVPNクライアントになるイメージ。
IdPやShibbolethについては、過去記事参照してくれると嬉しい。
前提条件
・ドメイン取得済み
・サーバー環境は構築済み
・Wireguardは構築しVPSとHomeで接続済み
#別記事作成予定
環境構築
まずは、VPSサーバーから作っていく。今回はubuntu20.04LTSを選択。
FireWallでIP制限等、初期設定をしておく。
ShibbolethとApacheをインストール。
#apacheのインストール
sudo apt install Apache2
残念ながらShibbolethは、ubuntuリポジトリにないのでswitchのリポジトリからダウンロードす
る。
#リポジトリの追加
curl --fail --remote-name https://pkg.switch.ch/switchaai/ubuntu/dists/focal/main/binary-all/misc/switchaai-apt-source_1.0.0~ubuntu20.04.1_all.deb
sudo apt install ./switchaai-apt-source_1.0.0~ubuntu20.04.1_all.deb
sudo apt update
#shibbolethをインストール
sudo apt update
sudo apt install --install-recommends shibbolet
#SSL証明書取得用にLet’s Encryptも入れておく
sudo apt install python-certbot-apache
sudo certbot --apache -d ドメイン
次にApacheの設定をする。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
Include /etc/letsencrypt/options-ssl-apache.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ServerName サーバーのドメイン
ProxyRequests Off
<Location />
<RequireAny>
AuthType shibboleth
ShibRequestSetting requireSession true
require shibboleth
require shib-session
#ShibUseHeaders On
#クライアントアプリからのアクセスはSSOをSKIPしている。
Require expr %{HTTP_USER_AGENT} =~ /(ownCloud|Nextcloud)/
Require ip IPAddress
</RequireAny>
ShibUseHeaders On
ProxyPreserveHost On
ProxyPass http://Wireguardで割り振ったNextcloudのIP
ProxyPassReverse http://Wireguardで割り振ったNextcloudのIP
</Location>
SSLCertificateFile 証明書のパス
SSLCertificateKeyFile 証明書のパス
</VirtualHost>
ここで一旦、Auth0の設定に移る。
Auth0
今回、NextcloudやApacheのSSO IdPとしてAuth0使う。
Oneloginでも良かったんだけど、無料だしイケてる感じがするという理由でAuth0を選択。
Sign Upはいつもの流れでぽちぽちして進める。

登録が完了したらSAML(SSO)の設定を進めていく。
メニューからあぷりけーしょんを選択して、CREATEアプリケーションを押下する。



アプリケーションタイプはSimpleを選択し、いい感じの名前を設定する。
作成できたらAddonsからSAML2をONにする。

ONにするとポップアップが表示されるので、証明書とIdP Metadataダウンロードを選択する。
メタデータにはこんな感じのデータが格納されている。
<EntityDescriptor entityID="IdP(Auth0)のId" xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
<IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<KeyDescriptor use="signing">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>証明書</X509Certificate>
</X509Data>
</KeyInfo>
</KeyDescriptor>
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="ログアウトURL"/>
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="ログアウトURL"/>
<NameIDFormat>認証情報の格納形式</NameIDFormat>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="SPからの認証要求投げ先"/>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="SPからの認証要求投げ先"/>
<Attribute Name="各種ユーザー情報を格納する形式等"/>
</IDPSSODescriptor>
</EntityDescriptor>
ここで後々必要になってくるのはentityIDなのでメモっておく。
Settingsタブに移動してCallback URLを指定する。
ドメイン名/apps/user_saml/saml/acsを入力する。

次にnextcloudを Auth0に登録する


Application LoginURIにドメイン/login
AllowedcallbackURLsにドメイン/apps/user_saml/saml/acsを指定する。
Shibbolethの設定
cd /etc/shibboleth/
#ダウンロードしたAuth0のメタデータをこのフォルダにハイ位置する。
#いけないことだけど、vimでコピペした。
#shibbolethのconfをいじる
sudo vim shibboleth2.xml
#Line 26
<SSO entityID="エンティティId"
discoveryProtocol="SAMLDS" discoveryURL="https://ds.example.org/DS/WAYF">
SAML2
</SSO>
#Line 115
<MetadataProvider type="XML" validate="true" path="上で保存したメタデータのファイル名"/>
#保存してShibbolethを再起動する
sudo systemctl restart shibd
ここまで設定できれば、VPS側のドメインを叩くとAuth0のログイン画面が表示されるはず。

NextCloudのセットアップ
今度はHomeサーバーでの作業に移る。
基本は公式ドキュメント通りに進めればOK。今回はPostgresサーバーをリポジトリに使ったので、
別記事にする。
https://docs.nextcloud.com/server/latest/admin_manual/installation/example_ubuntu.html
インストールが終わったら、SAMLアプリを追加して設定を進める。

・UIDをマッピングする属性=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
#auth0に登録してあるメールアドレスをnextcloudのユーザーIdとして使う場合
・IdPのエンティティId=Issuer
・IdPの表示名は好きなものを
・SPが認証要求メッセージを送る〜=IdentitityProvierLoginURL
・SLOを要求する場所=IdentitityProvierLoginURL/logoutを指定

ここまで設定すると
nextcloudのログイン画面にDirectログインとSSOでログインするかの選択肢が表示される。
ただ、選択肢が表示されるのはイケてないので自動的にSSOログインが実行されるようにnginxで
リライトする。
rewrite ^/index\.php/apps\/user_saml\/saml\/selectUserBackEnd?(.*)$ https://ドメイン/index.php/apps/user_saml/saml/login?originalUrl=&idp=1 break;
これで自動的にSSOが実行されれるはず。
おわり
終わり
コメント