Nextcloud と連携してみよう

Drupal と Nextcloud を連携させる

Drupal さっぽろ勉強会

内容

  • Nextcloud と Drupal
    • Nextcloud とは
    • Drupal との連携
  • 予備知識の整理
    • ソーシャルログインと SSO
    • 基盤となる技術/規格
    • 参考資料(全体把握、OAuth、OIDC)
  • 実際に動かしてみる
    • 実習環境の準備
    • OAuth2 によるソーシャルログイン
    • OIDC による SSO
    • デジタルアセットの共有

Nextcloud と Drupal

Nextcloud とは

  • 元はストレージ共有の ownCloud からフォーク
  • Google Apps と同等の機能を OSS で
    • ドキュメント共有
    • メール、カレンダー、スケジュール管理
  • 「アプリ」による機能拡張
  • 主に組織内のデータ共有と管理に使われる

Drupal との連携

  • ユーザー登録の一元化
    • 一方にログインすれば両方を使える
    • シングルサインオン
  • DAM(Digital Asset Management)
    • 画像や動画などのデジタル資産の共有
    • ファイル管理は Nextcloud で
    • Web サイトでの活用は Drupal で

予備知識の整理

ソーシャルログインと SSO

  • ソーシャルログイン
  • SSO(Single Sign-On)

SSO の方式

  • エージェント方式
  • リバースプロキシ方式
  • 代理認証方式
  • 透過型方式
  • フェデレーション方式

参照:
https://www.hitachi-solutions.co.jp/iam/sol_signon.html

基盤となる技術/規格

参考:IDaaS について

  • ID 管理
  • 認証/認可
  • SSO
  • 多要素認証
  • ログ管理

参考:OSS の Keycloak

参考資料

実習環境の準備

ffdsm の利用

## dsm47という名前のフォルダにffdsmをクローンする
$ git clone https://github.com/bkenro/ffdsm.git dsm47
## フォルダに移動して Vagrantfile を編集する
$ cd dsm47
$ vi Vagrantfile

synced_folder の調整

Vagrant.configure("2") do |config|
  config.vm.box = "bkenro/ffdsm"
  config.vm.network "private_network", ip: "192.168.56.81"
  config.vm.hostname = "dsm47.internal"
  config.vm.provider "virtualbox" do |vb|
    vb.name = "vm-dsm47"
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  # config.vm.synced_folder ".", "/vagrant", disabled: true
  # config.vm.synced_folder "www", "/var/www", type: "virtualbox"
end

仮想マシンの起動

$ vagrant up
〜
$ vagrant ssh

Nextcloud の入手とインストール

https://nextcloud.com/install/

$ sudo chown vagrant:vagrant /var/www
$ cd /var/www
$ wget https://download.nextcloud.com/server/releases/latest.zip
$ unzip latest.zip
$ sudo chown -R www-data:www-data nextcloud

仮想ホストの設定

/etc/apache2/sites-available/nextcloud.conf

<VirtualHost *:80>
  DocumentRoot /var/www/nextcloud
  ServerName nextcloud.internal

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Directory "/var/www">
    AllowOverride All
  </Directory>

</VirtualHost>

ホスト名の登録

## ホスト側
$ sudo vi /etc/hosts
### local dev hosts: dsm47
192.168.56.81   drupal.internal
192.168.56.81   nextcloud.internal

Nextcloud インストーラ

Nextcloud インストーラ

セットアップの問題確認

php.ini の調整

/etc/php/8.3/apache2/php.ini

〜
memory_limit = 512M
〜
opcache.interned_strings_buffer=16
〜

DB インデックスと Mimetype の修正

$ cd /var/www/nextcloud
$ sudo -u www-data php occ db:add-missing-indices
$ sudo -u www-data php occ maintenance:repair --include-expensive

Mailpit の利用設定

設定項目
送信モード SMTP
暗号化 None/STARTTLS
送信元アドレス 任意(例:admin@nextcloud.internal)
サーバーアドレス localhost:1025
認証を必要とする OFF

テストメールの受信確認

https 接続の設定

## 自己認証局の構成
$ mkcert -install
## ルート証明書と鍵の確認
$ ls $(mkcert -CAROOT)
rootCA-key.pem  rootCA.pem
## Vagrant の共有フォルダに移動
$ cd dsm47
## ルート証明書と秘密鍵をコピー
$ cp $(mkcert -CAROOT)/*.pem .

サーバー証明書の発行

$ mkcert nextcloud.internal

Created a new certificate valid for the following names 📜
 - "nextcloud.internal"

The certificate is at "./nextcloud.internal.pem" and the key at "./nextcloud.internal-key.pem" ✅

It will expire on 24 March 2027 🗓

サーバー証明書の設置

## 仮想マシン上
## ホストとの共有フォルダに移動
$ cd /vagrant
## サーバー証明書と鍵を所定の場所にコピー
$ sudo cp nextcloud.internal.pem /etc/ssl/certs/
$ sudo cp nextcloud.internal-key.pem /etc/ssl/private/
## Apache の SSL モジュールを有効化
$ sudo a2enmod ssl

HTTPS 用の仮想ホストの追加

## HTTPS 用の仮想ホストを追加
$ cd /etc/apache2/sites-available
$ sudo vi nextcloud-ssl.conf

/etc/apache2/sites-available/nextcloud-ssl.conf

<VirtualHost *:443>
  ## 対象ドメインと対応するディレクトリを指定
  ServerName nextcloud.internal
  DocumentRoot /var/www/nextcloud
  ## Apacheログの設定
  ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
  CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
  ## HTTPSの有効化と証明書/鍵ファイルの指定
  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/nextcloud.internal.pem
  SSLCertificateKeyFile   /etc/ssl/private/nextcloud.internal-key.pem

  <FilesMatch "\.(?:cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
  </FilesMatch>

  <Directory "/var/www">
    AllowOverride All
  </Directory>

  <Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
  </Directory>
</VirtualHost>

設定の反映

## 作成したhttps用の設定を組み込む
$ sudo a2ensite nextcloud-ssl.conf
## Webサーバーを再起動して反映
$ sudo systemctl restart apache2

仮想マシン内のホスト設定

$ sudo vi /etc/hosts

/etc/hosts

〜
### local dev hosts: dsm47
192.168.56.81   drupal.internal
192.168.56.81   nextcloud.internal

仮想マシン内で接続してみると

$ wget https://nextcloud.internal/
--2024-12-24 15:09:02--  https://nextcloud.internal/
Resolving nextcloud.internal (nextcloud.internal)... 192.168.56.81
Connecting to nextcloud.internal (nextcloud.internal)|192.168.56.81|:443... connected.
ERROR: cannot verify nextcloud.internal's certificate, issued by ‘CN=mkcert bkenro@dev01,OU=bkenro@dev01,O=mkcert development CA’:
  Unable to locally verify the issuer's authority.
To connect to nextcloud.internal insecurely, use `--no-check-certificate'.

CA の登録

## 仮想マシン内の操作
$ cd /vagrant
$ sudo cp rootCA.pem /usr/share/ca-certificates/
$ sudo vi /etc/ca-certificates.conf

/etc/ca-certificates.conf

〜
rootCA.pem
$ sudo update-ca-certificates

実際に動かしてみる

Drupal とソーシャルログイン

Drupal と SSO(OIDC 以外)

Drupal と OAuth2/OIDC

Nextcloud と SSO

実装例1

実装例2

Nextcloud を OIDC の IDP、Drupal を SP

実装例3

Drupal を OIDC の IDP、Nextcloud を SP

デジタルアセットの共有

アセットの選択画面

まとめ

今回の内容

  • Nextcloud と Drupal
    • Nextcloud とは
    • Drupal との連携
  • 予備知識の整理
    • ソーシャルログインと SSO
    • 基盤となる技術/規格
    • 参考資料(全体把握、OAuth、OIDC)
  • 実際に動かしてみる
    • 実習環境の準備
    • OAuth2 によるソーシャルログイン
    • OIDC による SSO
    • デジタルアセットの共有