[速報]Amazon Linux AMI 2016.09 がリリースされました!
PHP7.0が入ってNginx 1.10になった。
よって以前書いたエントリは使い物にならないので改めて書き直す。
その分いろいろ手間が省けて楽になったでいいけど。
sudo略。
AWS
アカウント作成
AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ
EC2(VPC)
RDS
タイムゾーンがUSTなので変える
[新機能]Amazon Auroraで日本時間が使用可能になりました!
設定
$ passwd ec2-user
#ローカルタイム変更
$ cp -rp /etc/localtime /etc/localtime.org
$ cp -rp /usr/share/zoneinfo/Japan /etc/localtime
#yum updateなどでUTCにもどるのを防ぐ
-ZONE="UTC"
-UTC=true
+ZONE="Asia/Tokyo"
+UTC=false
-LANG=en_US.UTF-8
+LANG=ja_JP.UTF-8
FTP
インストール
$ yum install -y vsftpd
$ cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
設定
+pasv_enable=YES
+pasv_addr_resolve=YES
+pasv_min_port=60001
+pasv_max_port=60100
#起動
$ service vsftpd start
$ chkconfig vsftpd on
PHP7.0
$ yum install -y php70 php70-fpm php70-gd php70-mbstring php70-mcrypt php70-mysqlnd php70-zip php70-opcache php70-pecl-apcu php70-pecl-apcu-devel php70-pecl-imagick php70-pecl-imagick-devel
$ php -v
# PHP 7.0.11
$ cp /etc/php-fpm-7.0.d/www.conf /etc/php-fpm-7.0.d/www.conf.org
-user = apache
+user = nginx
-group = apache
+group = nginx
+date.timezone = "Asia/Tokyo"
nginx
$ yum install -y nginx
$ nginx -v
# nginx version: nginx/1.10.1
$ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
charset UTF-8;
server_tokens off;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
root /var/www/html;
index index.php;
include /etc/nginx/default.d/*.conf;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi_params;
}
location ~* ^.+.(jpg|jpeg|gif|png|css|js|flv|swf|ico|xml|txt|eot|svg|ttf|woff|woff2)$ {
access_log off;
log_not_found off;
expires 30d;
}
location ~ /(\.ht|\.user.ini|\.git|\.hg|\.bzr|\.svn) {
deny all;
}
}
$ chown -R nginx:nginx /var/lib/php/7.0/session
$ chown -R nginx:nginx /var/www/html
$ service nginx start
$ service php-fpm-7.0 start
$ chkconfig nginx on
$ chkconfig php-fpm-7.0 on
ブラウザで確認
<?php echo phpinfo();?>
アップロードファイル上限
多分デフォルトで1Mなので増やす
server {
client_max_body_size 4M;
}
GitHub
Gitインストール
取り急ぎガバガバなのでセキュリティ注意ね
$ yum install -y git
$ git config --global user.email "[GitHubメールアドレス]"
$ git config --global user.name "[GitHubユーザー名]"
# GitHub クローン
$ cd /var/www/
$ mv /var/www/html /var/www/_html
$ git clone https://github.com/[path_to_git].git html
#ユーザー名とパス入力
# 以降はプルで
$ cd /var/www/html
$ git pull origin master
# ユーザー名とパス入力
# rootの場合は/var/wwww/html所有者を都度nginxにするのが良いと思われ
だからFTPはいらないね。
MySQL
インストール
$ yum install -y mysql56 mysql56-server
$ service mysqld start
$ chkconfig mysqld on
$ mysql -u root
> SET PASSWORD FOR root@localhost=PASSWORD('root');
$ service mysqld restart
phpMyAdmin
インストール
$ cd /var/www/
$ wget https://files.phpmyadmin.net/phpMyAdmin/4.8.0/phpMyAdmin-4.8.0-all-languages.tar.gz
$ tar zxvf phpMyAdmin-4.8.0-all-languages.tar.gz
$ rm phpMyAdmin-4.8.0-all-languages.tar.gz
$ mv phpMyAdmin-4.8.0-all-languages phpmyadmin
$ cd /var/www/phpmyadmin/
$ cp config.sample.inc.php config.inc.php
設定
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';//BASIC認証
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
server {
#For phpMyAdmin
location ^~ /phpmyadmin {
allow 0.0.0.0;#IP制限
deny all;
alias /var/www/phpmyadmin;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^/phpmyadmin(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /var/www/phpmyadmin$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
}
$ service nginx reload
BASIC認証
$ yum install -y httpd-tools
$ cd /etc/nginx
$ htpasswd -c .htpasswd [ユーザー名]
server {
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
SSL
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost;
root /var/www/html;
index index.php;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:60m;
include /etc/nginx/default.d/*.conf;
}
Let's Encrypt
色々あがいたけど
Amazon LinuxでLet's Encryptはあきらめろ、という
Amazon様の意思を感じたので従うことにした。
しゃーないので手動更新めんどくさいけど SSLボックス でLet's Encrypt発行する。
証明書: server.pem
中間証明書: chain.pem
秘密鍵: key.pem
とするならば
$ cat server.pem chain.pem > cert.pem
ってやって中間証明書結合する。
中間証明書いれないとChromeとFirefoxがうるさいからね。
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
}
http→httpsにリダイレクトさせる場合
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
return 301 https://$host$request_uri;
}
WordPress
ホームURL、WordPressURLを変更
$ UPDATE `wp_options` SET `option_value` = 'https://host' WHERE `wp_options`.`option_name` = 'siteurl' OR `wp_options`.`option_name` = 'home';
//ログイン画面と管理画面をhttpsにリダイレクト
define('FORCE_SSL_ADMIN', true);
if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https" ) {
$_SERVER['HTTPS'] = 'on';
}
HSTS
server {
listen 443 ssl;
#HTTPSのみで運用する場合のみ
add_header Strict-Transport-Security max-age=15768000;
}
Perfect Forward Security (PFS)
$ cd /etc/nginx/ssl
$ openssl dhparam 2048 -out dhparam.pem
server {
listen 443 ssl;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
}
HTTP/2
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
}
TLS/SSL
SSLv1.0,SSLv2.0,SSLv3.0は無効
server {
listen 443 ssl http2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
暗号スイート
server {
listen 443 ssl http2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
}
OCSP Stapling
server {
listen 443 ssl http2;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/cert.pem;
resolver 8.8.8.8;
}
セキュリティ評価
まあやってることは変わらないので今回もさすがにA+。