[php: SSO] Single Sign On on multiple servers with shared session by memcached. #php #cakephp #linux
<?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'
]
]);
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
以下全サーバーにてインストール&設定。インスタンスがサブドメイン違いなら上記クッキードメイン設定を。ドメイン自体が違う場合はトリッキーな 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
# 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