yano3nora
10/21/2017 - 10:01 AM

[php: SSO] Single Sign On on multiple servers with shared session by memcached. #php #cakephp #linux

[php: SSO] Single Sign On on multiple servers with shared session by memcached. #php #cakephp #linux

Across some sub domain in the same server.

refs

sample

<?php

// php <= 5.6
ini_set('session.cookie_domain', '.example.com'); 
session_start();

// php >= 7.0
session_start(['cookie_domain' => '.example.com']);


// In CakePHP
Configure::write('Session', [
    'defaults' => 'php',
    'ini' => [
        'session.cookie_path' => '/',
        'session.cookie_domain' => '.yourdomain.com'  
    ]
]);

Across another servers by memcached

restriction by ip

memcached はデフォルトだとポートさえ分かれば誰からのアクセスも許可しちゃうため アクセス制限を絶対にかけること 。しかも設定ファイルでは IP アドレス一個しか指定できない残念な子。IPTables で対処。

$ sudo vi /etc/sysconfig/iptables
> *filter
> :INPUT   ACCEPT [0:0]
> :FORWARD ACCEPT [0:0]
> :OUTPUT  ACCEPT [0:0]
> 
> -A INPUT -p tcp -m tcp --dport 11211 -i lo -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 11211 -s 指定サーバのIPアドレス1 -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 11211 -s 指定サーバのIPアドレス2 -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 11211 -s 指定サーバのIPアドレス3 -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 11211 -j DROP
> 
> COMMIT
$ sudo chkconfig iptables on
$ sudo service iptables restart

上記は セッションを共有するメインのサーバー用設定。 セッション実データの保存先を全体共有しない場合、メインサーバ以外のサーバでは localhost とメインサーバの IP だけ許可してあげればよいかな?

> -A INPUT -p tcp -m tcp --dport 11211 -i lo -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 11211 -s メインサーバIPアドレス -j ACCEPT

refs

install

以下全サーバーにてインストール&設定。インスタンスがサブドメイン違いなら上記クッキードメイン設定を。ドメイン自体が違う場合はトリッキーな JS + トークン による代理ログインみたいなことが必要だけど...正直 SSO では対処しきれないので OAuth を検討すべき。

# rpmforge リポジトリからもってくる
$ sudo yum --enablerepo=remi,epel,rpmforge install -y memcached
# php-pecl-memcached を自分の PHP 依存環境にあわせてもってくる
$ sudo yum --enablerepo=remi,epel,rpmforge,remi-php71 -y install php-pecl-memcached
$ sudo vi /etc/sysconfig/memcached
> CACHESIZE=512   # 1024 とかでも
$ sudo vi /etc/php.ini  # 以下コメントアウト
> ; session.save_handler = files
> ; session.save_path = "/var/lib/php/session"
$ sudo vi /etc/php.d/memcached.ini  # 末尾追加
> session.save_handler = memcached
> session.save_path = "{IP_ADDRESS}:11211"  
# 複数指定で全体共有か1インスタンス管理かはケースバイケース ( {IP_1}:11211, {IP_2}:11211, ... )
# 1インスタンスのみのほうがセッションロックが起こりづらいケドそいつが死ぬとみんな死ぬ
$ sudo vi /etc/httpd/conf.d/php.conf
> # session.save_handler = files               # コメントアウト
> # session.save_path = "/var/lib/php/session" # コメントアウト
$ sudo chkconfig memcached on
$ sudo service httpd restart
$ sudo service memcached restart

bash 流し込み用

# Install and setting for memcashed 
sudo yum --enablerepo=remi,epel,rpmforge install -y memcached
sudo yum --enablerepo=remi,epel,rpmforge,remi-php71 -y install php-pecl-memcached
sudo sed -i -e "s|CACHESIZE=\"64\"|CACHESIZE=\"512\"|" /etc/sysconfig/memcached
sudo sed -i -e "s|session.save_handler = |;session.save_handler = |" /etc/php.ini
sudo sed -i -e "s|session.save_path = |;session.save_path = |" /etc/php.ini
sudo sed -i -e "s|php_value session.save_handler|# php_value session.save_handler|" /etc/httpd/conf.d/php.conf
sudo sed -i -e "s|php_value session.save_path|# php_value session.save_path|" /etc/httpd/conf.d/php.conf
sudo sh -c "echo 'session.save_handler = memcached' >> /etc/php.d/memcached.ini"
sudo sh -c "echo 'session.save_path = \"192.168.33.10:11211\"' >> /etc/php.d/memcached.ini"
sudo sh -c "echo 'session.save_handler = memcached' >> /etc/php-fpm.d/www.conf"
sudo sh -c "echo 'session.save_path = \"192.168.33.10:11211\"' >> /etc/php-fpm.d/www.conf"
sudo sh -c "echo '*filter' >> /etc/sysconfig/iptables"
sudo sh -c "echo ':INPUT   ACCEPT [0:0]' >> /etc/sysconfig/iptables"
sudo sh -c "echo ':FORWARD ACCEPT [0:0]' >> /etc/sysconfig/iptables"
sudo sh -c "echo ':OUTPUT  ACCEPT [0:0]' >> /etc/sysconfig/iptables"
sudo sh -c "echo '' >> /etc/sysconfig/iptables"
sudo sh -c "echo '-A INPUT -p tcp -m tcp --dport 11211 -i lo -j ACCEPT' >> /etc/sysconfig/iptables"
sudo sh -c "echo '-A INPUT -p tcp -m tcp --dport 11211 -s 192.168.33.0/24 -j ACCEPT' >> /etc/sysconfig/iptables"
sudo sh -c "echo '-A INPUT -p tcp -m tcp --dport 11211 -j DROP' >> /etc/sysconfig/iptables"
sudo sh -c "echo '' >> /etc/sysconfig/iptables"
sudo sh -c "echo 'COMMIT' >> /etc/sysconfig/iptables"
sudo chkconfig iptables on
sudo service iptables restart
sudo iptables -L
sudo chkconfig memcached on
sudo service memcached start