自宅NextCloudをリバプロとSSOで外部公開する WireGuard

技術

やりたいこと

 自宅ネット環境がよろしくなく、宅内に立てた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が実行されれるはず。

おわり

終わり

技術
スポンサーリンク
Probiees

コメント

タイトルとURLをコピーしました