徒然なるままに プログラミングメモや日々の生活などつれづれとつづっていくblog

2017年10月18日

Mastodonをローカルファイルからオブジェクトストレージへ移行する

Filed under: Mastodon — ranpei @ 10:30 PM

個人インスタンスだし別にいいかな?って思っていたのですが、

今回master追随の試験インスタンスを作るに

本稼働インスタンスとデータを共有した状態にしたくて

オブジェクトストレージへ移行したのでその忘却禄をメモします。

 

 

まず、移行の流れですが

1. S3準拠のオブジェクトストレージを用意する。(今回はminioを使用)

2. public/system配下のデータをオブジェクトストレージへコピーする。

3. mastodonの設定を変更する。

っといった感じです。

 

最後の設定に手間取りましたがファイルのコピーはコマンド一発なので

わかってしまえばそれほど難しいことではないです。

 

では、細かい手順を書いていきます。

 

■S3準拠のオブジェクトストレージを用意する

DockerHubでminioのイメージが配布されていますのでこれを利用します。

mastodonのdocker-compose.ymlを以下のように修正

  # webとstreamingのdepends_on:設定にminioへの内部リンクを追記
    depends_on:
      - db
      - redis
   ↓
    depends_on:
      - db
      - redis
      - minio


  # 末尾に追記
  minio:
    image: minio/minio
    restart: always
    ports:
      - "9000:9000"
    volumes:
      - /root/mastodon-volume/minio/data:/data
      - /root/mastodon-volume/minio/config:/root/.minio
    command: [server, /data]

 

Dockerを起動したらaccessKeyとsecretKeyを起動ログから入手しましょう。

# docker-compose up -d
# docker logs mastodon_minio_1
[root@localhost mastodon]# docker logs mastodon_minio_1
Endpoint:  http://172.18.0.5:9000  http://127.0.0.1:9000
AccessKey: {accessKey}
SecretKey: {secretKey}
            :

※ これは以降の手順で必要となりますのできちんとメモしておきましょう

■public/system配下のデータをオブジェクトストレージへコピーする

まずは、オブジェクトストレージにファイルを配置する場所(bucket)を作成します。
http://[IPアドレス]:9000/にアクセスしてください。


上記の画面が表示されたらメモしたaccessKeyとsecretKeyでログインします。

ログインしたら右下の「+」からbucketを作成してください。


(今回は「media」という名前で作成しています)

次にアクセス権を設定します。
「media」の右側に出る「・・・」をクリックしてください。

入力欄には何も入力せずにAddでポリシーを追加します。
(Read Onlyとして外部からオブジェクトストレージへの参照ができるようにします)

bucketの作成が終わったらファイルをコピーしていきます。
コピーにはminioのcliクライアントを利用しますので、まずはcliクライアントをインストールします。

# curl https://dl.minio.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
# chmod +x /usr/local/bin/mc

インストールしたら以下のコマンドでローカルファイルをminioに登録していきます。
(自身の永続化設定に合わせてpublic/systemのパスはよみかえてください)

# mc config host add mastodon_minio_1 http://127.0.0.1:9000 {accessKey} {secretKey}
# mc -r public/system mastodon_minio_1/media

※ ファイル量によってコピーに時間はかかりますが、気長に待ちましょう。

 

■mastodonの設定を変更する

オブジェクトストレージを使用するように.env.productionを編集します。

minio用のひな型が記載されているのでコメントを外して以下のように設定します。

# S3 (Minio Config (optional) Please check Minio instance for details)
S3_ENABLED=true
S3_BUCKET=media
AWS_ACCESS_KEY_ID={accessKey}
AWS_SECRET_ACCESS_KEY={secretKey}
# S3_REGION=
S3_PROTOCOL=https
S3_HOSTNAME={インスタンスのドメイン}
S3_ENDPOINT=http://minio:9000/

 

設定が終わったらdocker-compose up -dで再作成&再起動しましょう。

以上でオブジェクトストレージへの移行は完了します。

 

頻繁に外部からトゥートが来る環境の場合、

設定を先に行い、ファイルコピーを後にするといいかもしれません。

2017年10月1日

Cakephp3.x系でSAML認証を実装する

Filed under: apache,Cakephp3,OSS,PHP,SAML認証 — ranpei @ 7:12 AM

今回は完全プライベートなネタではないのですが、

Cakephp3を使ってSAML認証を行うプラグインを作成したのでその使い方をまとめようと思います。

(SAMLの設定が結構面倒なのでまとめておきたかったってのもあります。)

 

■環境構築

何はともあれ、まずは環境構築です。

今回の構成は以下のようになります。

・基盤

OS: CentOS7.2

Webサーバー:Apache2.4

PHP: 5.6

・アプリケーション

Identity Provider: SimpleSAMLphp

Service Provider: Cakephp3.x + 自前プラグイン(SamlAuthenticationPlugin)

 

●Apacheインストール

# yum install httpd

●PHP5.6インストール

普通にyumでインストールすると5.4系が入るため、

ここを参考にEPELとRemiリポジトリのパッケージを使用します。

# yum install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-mysql php-pdo php-gd php-xml php-mcrypt php-gmp php-intl

バージョンを確認してみましょう。

# php -v
PHP 5.6.31 (cli) (built: Jul 6 2017 08:06:11)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

 

Cakephpのパッケージ管理に使用されているためComposerをインストールします。


# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer

 

●SimpleSAMLphp配置

SimpleSAMLphpを配置します。配置先はhttp://xxx.xxx.xxx/simplesaml/とします。

 

まずは、公式サイトからファイルを落としてきましょう。

DLし終わったらSCPなどを使ってWebサーバーにアップロードしてください。

 

●SimpleSAMLphpの設定

ファイルの解凍と配置を行います。(私は/var/www/simplesaml/に配置しました)

# tar zxvf simplesamlphp-1.14.16.tar.gz
# mv simplesamlphp-1.14.16 /var/www/simplesaml

 

●Cakephp3.x + 自前プラグイン

まずはCakephpを配置します。(私は/var/www/ssoapp/に配置しました)

# composer self-update && composer create-project --prefer-dist cakephp/app ssoapp

 

pluginsフォルダにSAML認証プラグインを配置します。

# cd ssoapp/plugins
# git clone https://github.com/gittrname/SamlAuthenticationPlugin.git

 

プラグインを有効化しましょう。

# cd ..
# vi config/bootstrap.php
// 最下部に追記
Plugin::load('SamlAuthenticationPlugin', ['bootstrap' => true, 'routes' => true]);
# vi composer.json
// 以下を編集
"josegonzalez/dotenv": "2.*"
↓
"josegonzalez/dotenv": "2.*",
"onelogin/php-saml": "^2.11.0"
 
"psr-4": {
"App\\": "src"
}
↓
"psr-4": {
"App\\": "src",
"SamlAuthenticationPlugin\\": "plugins/SamlAuthenticationPlugin/src"
}

 

終わったらcomposerで外部ライブラリのインストールと

autoloadの構築を行います。

# composer install

 

 

●ApacheのAlias設定

# vi /etc/httpd/conf.d/saml.conf ← 新規作成
// 以下を記載
Alias /simplesaml/ /var/www/simplesaml/www/
<Directory /var/www/simplesaml/www/>
AllowOverride None
Require all granted
</Directory>

Alias /ssoapp/ /var/www/ssoapp/webroot/
<Directory /var/www/ssoapp/webroot/>
AllowOverride None
Require all granted
<IfModule mod_rewrite.c>
RewriteEngine On
# RewriteRule ^(.*)/$ /ssoapp/$1 [L,R=300]
RewriteBase /ssoapp
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
</Directory>

Apacheを再起動します。

# systemctl restart httpd

 

ここまででとりあえず前段階終了です。

・・・・そう!前段階なんです。この後の設定が回りくどく苦戦しました;;;

 

ざっくり行くと、まずIdpの証明書情報などをSPに登録、

次にSPの証明書情報などをIdpに登録する流れになります。

 

●Idpの証明書情報をSPに登録

登録する前にIdp側で証明書を作成します。

(実働環境だとオレオレではなく正規に発行してもらったものを使用するんでしょうね)

# cd /var/www/simplesaml/cert
# openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem

SAML2.0-Idpのモジュールを有効化します。

# vi /var/www/simplesaml/config/config.php
// 以下を変更
'enable.saml20-idp' => false,
↓
'enable.saml20-idp' => true,
 # touch modules/exampleauth/enable 

終わったらhttp://xxx.xxx.xxx/simplesaml/saml2/idp/metadata.phpにアクセスしてみましょう。

XMLが表示されたらその内容をメモっておきます。

必要となるのは「md:EntityDescriptorのentityId」「ds:X509Certificateの証明書文字列」

「md:SingleLogoutServiceのLocation」「md:SingleSignOnServiceのLocation」です。

 

では、SPに登録しましょう。

・・・・・とその前にSPの証明書を作成します;;;(またかよ・・・)

これも実働環境だと(ry

# cd /var/www/ssoapp/plugins
# mkdir cert
# cd cert
# openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem

 

作成した証明書をプラグインに設定します。

# cd ..
# cd config
# vi app.php
<?php
return [
'saml_config' => [
'baseurl' => 'http://xxx.xxx.xxx/ssoapp',
'sp' => [
'entityId' => 'http://xxx.xxx.xxx/ssoapp',
'assertionConsumerService' => [
'url' => 'http://xxx.xxx.xxx/ssoapp/saml-auth/login',
],
'singleLogoutService' => [
'url' => 'http://xxx.xxx.xxx/ssoapp/saml-auth/logout',
],
'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
'x509cert' => '{server.crtの中身をコピペ}',
'privateKey' => '{server.pemの中身をコピペ}'
],
'idp' => [
'entityId' => 'md:EntityDescriptorのentityId',
'singleSignOnService' => [
'url' => '{md:SingleSignOnServiceのLocation}',
],
'singleLogoutService' => [
'url' => '{md:SingleLogoutServiceのLocation}',
],
'x509cert' => '{ds:X509Certificateの証明書文字列}'],
]
];

 

保存したらhttp://xxx.xxx.xxx/ssoapp/saml-auth/metadataを表示してみてください。

XMLが表示されたらOKです。例によってこのXMLの情報をIdp設定で使用します。

 

●SPの証明書情報をIdpに登録

# vi /var/www/simplasaml/metadata/saml20-sp-remote.php
// 以下を追記
$metadata['http://xxx.xxx.xxx/ssoapp/'] = array(
'AssertionConsumerService' => 'http://xxx.xxx.xxx/ssoapp/saml-auth/login',
'SingleLogoutService' => 'http://xxx.xxx.xxx/ssoapp/saml-auth/logout',
'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
'simplesaml.nameidattribute' => 'uid',
'simplesaml.attributes' => FALSE,
);

 

認証用アカウント(ID=test, Pass=test)を作成

# vi /var/www/simplasaml/config/authsources.php
<?php
$config = array(
    'example-userpass' => array(
        'exampleauth:UserPass',
        'test:test' => array(
            'uid' => array('test'),
            'eduPersonAffiliation' => array('member', 'employee'),
        ),
    ),

これで完了です。

 

 

■動作確認

http://xxx.xxx.xxx/loginにアクセスするとIdp側のログイン画面にリダイレクトされます。

そこで認証が完了すればSP側に戻って認証情報が参照できるはずです。

 

・動作サンプル




 

 

 

参考)

 

Powered by WordPress