■目次
ApacheApache+SSL(有料証明書なしでSSLを導入する場合)Apache+SSL(有料証明書でSSLを導入する場合)Apache+SSL(有料証明書を更新する場合)Let's Encrypt(無料SSL証明書)Apache+PHPnginxnginx+PHP7MySQLPostgreSQLFTPD
■Apache
※Webサーバを構築する ※IPアドレスでアクセスしたときはIPアドレスもしくはサーバ名だけが表示されるページにアクセス、 ドメインを指定してアクセスしたら対応するページにアクセス。 とすると管理しやすいかも ※バーチャルホストが不要な案件でも、後々検収環境が追加されたりを想定して、常にバーチャルホストにしておくといいかも バーチャルホストの設定方法は etcetera.txt を参照 ※バーチャルホストにした場合、access_log にサブドメインが残らないのでページを判別しづらい (リファラには表示されるが、外部からアクセスされたときなどはダメ) サブドメイン名を記録するか、サブドメインごとにログファイルを分けておいた方が良さそう ※PHP5.6を使うならApacheは2.4をインストールする。詳細は programming.txt を参照 ■インストール 参考:Webサーバー構築(Apache) http://centossrv.com/apache.shtml # yum -y install httpd … httpdをインストール # vi /etc/httpd/conf/httpd.conf … httpdの設定ファイルを編集
#ServerTokens OS ServerTokens Prod … エラーページなどでOS名を表示しないようにする #ServerName www.example.com:80 ServerName refirio.net:80 … サーバー名を指定(設定しておかないと、サーバ起動時に警告が表示される Webサーバが複数ある場合は「ServerName web1.refirio.net:80」など) <Directory "/var/www/html"> #Options Indexes FollowSymLinks Options Includes ExecCGI FollowSymLinks …CGI、SSIを許可する場合 #AllowOverride None AllowOverride All ….htaccessを許可する場合 #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined … 長すぎるURI(414エラー)をログに記録しない場合 LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i %v" combined … 処理時間やプロキシのIPなども記録する例 # # For a single logfile with access, agent, and referer information # (Combined Logfile Format), use the following directive: # SetEnvIf Request_URI "favicon\.ico" no_log … faviconへのアクセスをログに記録しない場合に追加 SetEnvIf Request_URI "default\.ida" no_log … wormからのアクセスをログに記録しない場合に追加 SetEnvIf Request_URI "cmd\.exe" no_log … 同上 SetEnvIf Request_URI "root\.exe" no_log … 同上 SetEnvIf Request_URI "Admin\.dll" no_log … 同上 SetEnvIf Request_URI "NULL\.IDA" no_log … 同上 SetEnvIf Remote_Addr 192.168.1 no_log … 内部からのアクセスをログに記録しない場合に追加 SetEnvIf Remote_Addr 127.0.0.1 no_log … 自ホストからのアクセスをログに記録しない場合に追加 CustomLog logs/access_log combined env=!no_log … 上記以外のアクセスをログに記録する #ServerSignature On ServerSignature Off … エラーページでサーバー情報を表示しないようにする #AddDefaultCharset UTF-8 … UTF-8以外でページを作成する場合はコメントアウト(文字化け対策) #AddHandler cgi-script .cgi AddHandler cgi-script .cgi .pl … .plをCGIとして実行する場合 <Directory "/var/www/icons"> #Options Indexes MultiViews FollowSymLinks Options MultiViews FollowSymLinks … iconsディレクトリのファイル一覧を表示しないように AllowOverride None Order allow,deny Allow from all </Directory>
# rm -f /etc/httpd/conf.d/welcome.conf … テストページを削除 # rm -f /var/www/error/noindex.html … 同上 # ln -s /usr/bin/perl /usr/local/bin/perl … Perlコマンドへ /usr/local/bin/perl でもアクセスできるように # whereis perl … Perlのパスを確認 perl: /usr/bin/perl /usr/local/bin/perl /usr/share/man/man1/perl.1.gz # chown apache. /var/www/ … 公開用ディレクトリの所有者をapacheに変更 # chmod 775 /var/www/ … apacheグループのユーザに読み書き実行を許可 # chown apache. /var/www/html/ … ドキュメントルートの所有者を「apache」に変更 # chmod 775 /var/www/html/ … apacheグループのユーザに読み書き実行を許可 # ll /var/www/ … ドキュメントルートの所有者を確認 合計 24 drwxr-xr-x 2 root root 4096 10月 5 11:45 cgi-bin drwxr-xr-x 3 root root 4096 10月 9 00:19 error drwxr-xr-x 5 apache apache 4096 9月 27 17:43 html drwxr-xr-x 3 root root 4096 9月 27 09:29 icons # chown apache. /var/www/cgi-bin/ … 必要なら他のフォルダにも同様の設定を行う # chmod 775 /var/www/cgi-bin/ # chown apache. /var/www/error/ # chmod 775 /var/www/error/ # chown apache. /var/www/icons/ # chmod 775 /var/www/icons/ # service httpd configtest … 設定ファイルの構文をチェック # service httpd start … httpdを起動 httpd を起動中: [ OK ] # chkconfig httpd on … httpdの自動起動を設定 ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定(80ポートを開ける)
#HTTPを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 ■動作確認 # vi /var/www/html/index.html … テストページ作成
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>テスト</title> </head> <body> <p>テスト。</p> </body> </html>
http://refirio.net/ のようにブラウザからアクセスを確認
■Apache+SSL(有料証明書なしでSSLを導入する場合)
※暗号化して通信する ■インストール(サーバ用秘密鍵・証明書作成) 参考:Webサーバー間通信内容暗号化(Apache+mod_SSL) http://centossrv.com/apache-ssl.shtml 参考:CentOS(さくらのVPS)に、mod_sslをインストール http://havelog.ayumusato.com/develop/server/e168-centos-mod_ssl-install.html # yum -y install mod_ssl … mod_sslインストール # cd /etc/pki/tls/certs/ … ディレクトリ移動 # sed -i 's/365/3650/g' Makefile … サーバ用証明書有効期限を1年から10年に変更 # make server.crt … サーバ用秘密鍵・証明書作成 umask 77 ; \ /usr/bin/openssl genrsa -des3 1024 > server.key Generating RSA private key, 1024 bit long modulus .................++++++ ............++++++ e is 65537 (0x10001) Enter pass phrase: … 任意のパスワードを設定(表示はされない) Verifying - Enter pass phrase: … 任意のパスワードを確認(表示はされない) umask 77 ; \ /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 3650 -out server.crt -set_serial 0 Enter pass phrase for server.key: … 上で設定したパスワードを入力(表示はされない) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP … 国名を設定 State or Province Name (full name) [Berkshire]:Tokyo … 都道府県名を設定 Locality Name (eg, city) [Newbury]:Shibuya … 市区町村名を設定 Organization Name (eg, company) [My Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 # openssl rsa -in server.key -out server.key … サーバ用秘密鍵からパスワード削除(Webサーバ起動時にパスワードを要求されないように) Enter pass phrase for server.key: … サーバ用秘密鍵・証明書作成時のパスワードを入力(表示はされない) writing RSA key ■インストール(サーバ用秘密鍵・証明書設定) # vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集
SSLCertificateFile /etc/pki/tls/certs/server.crt … サーバ用証明書を指定 SSLCertificateKeyFile /etc/pki/tls/certs/server.key … サーバー用秘密鍵を指定 # General setup for the virtual host, inherited from global configuration #DocumentRoot "/var/www/html" DocumentRoot "/var/www/html" … #を削除(コメントを解除) # SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: #SSLProtocol all -SSLv2 SSLProtocol all -SSLv2 -SSLv3 … SSLv2、SSLv3を無効化する(POODLE SSLv3.0 脆弱性問題対処)
# service httpd configtest … 設定ファイルの構文をチェック # service httpd restart … Apacheを再起動して、パスワードを要求されないことを確認 httpd を停止中: [ OK ] httpd を起動中: [ OK ] ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定(443ポートを開ける)
#HTTPSを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 https://refirio.net/ のようにブラウザからアクセスを確認
■Apache+SSL(有料証明書でSSLを導入する場合)
※証明書を更新することを想定して、鍵や証明書などの名前には年月日を含めた方が良さそう ※証明書の価格に差はあるが、これは信頼性による差。暗号化の強度に差は無い ただし安い証明書は、「証明書に聞き慣れない会社の名前が表示される」「サイトシールがない」などの問題があるので注意する ※SSLを購入する際、ワイルドカードとして購入しなければ複数のサブドメインには対応できない ただしワイルドカードはフィーチャーフォンに対応できない可能性が上がるので注意する ワイルドカードは高額なので注意 https://www.ssl.ph/globalsign/option/wildcard.html ■インストール(mod_sslをインストールしていない場合) 参考:Webサーバー間通信内容暗号化(Apache+mod_SSL) http://centossrv.com/apache-ssl.shtml 参考:CentOS(さくらのVPS)に、mod_sslをインストール http://havelog.ayumusato.com/develop/server/e168-centos-mod_ssl-install.html # yum -y install mod_ssl … mod_sslインストール # service httpd restart … Apacheを再起動 httpd を停止中: [ OK ] httpd を起動中: [ OK ] ■SSL証明書発行(GMOグローバルサインの例) ※以降は有料の証明書を導入する場合 CSR … refirio.net.csr … 公開鍵の情報が含まれる 中間証明書 … ica.refirio.net.crt … ブラウザによっては、これが無くてもエラーにならない 秘密鍵 … refirio.net.key … 流出してはいけない 参考:[CSR生成] Apache 2.x + mod_ssl + OpenSSL(新規・更新) https://jp.globalsign.com/support/csr/04.html?service=ssl 参考:[インストール] Apache 2.x + mod_ssl + OpenSSL(新規・更新) https://jp.globalsign.com/support/server/03.html?service=ssl 参考:認証レベルの違い https://jp.globalsign.com/service/ssl/knowledge/types-of-ssl.html ■CSR生成 ※CSRとは、サーバ証明書を発行するための署名要求(Certificate Signing Request) ※秘密鍵があれば、CSRは何度でも生成できる。秘密鍵を無くさないように注意 ※秘密鍵は同じものを使えるが、毎回違うものを使うほうがセキュリティ上好ましい 参考:CSRについて教えてください。 https://jp.globalsign.com/support/faq/65.html # openssl version … OpenSSLがインストールされているか確認 OpenSSL 1.0.1e-fips 11 Feb 2013 # cd /etc/httpd/conf/ … ディレクトリ移動 # mkdir ssl.key … 秘密鍵用のディレクトリを作成 # openssl genrsa -des3 -out ./ssl.key/refirio.net.20160130.key 2048 … 秘密鍵を生成 Generating RSA private key, 2048 bit long modulus ......+++ .............+++ e is 65537 (0x10001) Enter pass phrase for ./ssl.key/refirio.net.20160130.key: … 任意のパスワードを設定(表示はされない) Verifying - Enter pass phrase for ./ssl.key/refirio.net.20160130.key: … 任意のパスワードを確認(表示はされない) # cat ssl.key/refirio.net.20160130.key … 秘密鍵の内容を確認 -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA59AjojbAXnDxZvaFaH1IeWS72I/kAzvifE/S8m3nm3bPa3Mh 〜省略〜 vL7hdUQEG+lN0yc/aVlNJ4xMXrKns7TCxrNGCEzBXgdqPXd0baTqNg== -----END RSA PRIVATE KEY----- # mkdir ssl.csr … CSR用のディレクトリを作成 # openssl req -new -key ./ssl.key/refirio.net.20160130.key -out ./ssl.csr/refirio.net.20160130.csr … CSRを生成 Enter pass phrase for ./ssl.key/refirio.net.20160130.key: … 上で設定したパスワードを入力(表示はされない) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP … 国名を設定 State or Province Name (full name) []:Tokyo … 都道府県名を設定 Locality Name (eg, city) [Default City]:Shibuya … 市区町村名を設定 Organization Name (eg, company) [Default Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 ※クイック認証の場合、管理者メールアドレスは不要みたい ※サブドメイン secure.refirio.net で利用するとして、サーバが複数台構成のために web1.refirio.net のような名前の場合、 「Common Name」には「secure.refirio.net」を入力する。つまり、あくまでも「ブラウザでサーバにアクセスする際に入力するURL」となる。 参考:コモンネームについて教えてください。 https://jp.globalsign.com/support/faq/67.html Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: … 空Enter An optional company name []: … 空Enter # openssl rsa -in ssl.key/refirio.net.20160130.key -out ssl.key/refirio.net.20160130.key … サーバ用秘密鍵からパスワード削除(Webサーバ起動時にパスワードを要求されないように) Enter pass phrase for refirio.net.20160130.key: … サーバ用秘密鍵・証明書作成時のパスワードを入力(表示はされない) writing RSA key # cat ssl.csr/refirio.net.20160130.csr … CSRの内容を確認 -----BEGIN CERTIFICATE REQUEST----- MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTEVMBMG 〜省略〜 bzhh/X0SHFCYaHAHIJYLUx2Ii3265wENEwdsteXVps8zTyuKw6jZaq/1 -----END CERTIFICATE REQUEST----- ■証明書申し込み(GMOグローバルサインの例) https://system.globalsign.com/au/signon/gacp/login.do からログインし、「証明書発行」を選択して申し込む 1. サービス選択 ※以下は入力例 サービス クイック認証SSL キャンペーン/クーポンコード 使用しない コモンネームオプション 無し(サブドメインへの対応が不要でよければ) 署名ハッシュアルゴリズム SHA256 契約期間 1年 乗り換え いいえ 更新 いいえ 期間カスタマイズオプション なし 2. 技術担当者情報入力 自動入力で入力し、必要があれば編集する 「メール送信先に指定」にチェックしておくと、 技術担当者情報で設定したメールアドレスにも申し込み完了メールなどが届く 3. CSR DN情報入力 「CSRを利用する」のままで、サーバサイドで生成したCSRを貼り付ける 次へ進むとCSR内容確認が表示される。以下は例 CSR解析結果 / スキップ入力内容 審査される証明書の内容 CN refirio.net refirio.net O refirio.net OU Domain Control Validated L Shibuya S Tokyo C 日本 - JP 日本 - JP E refirio@example.com 鍵長 2048 2048 公開鍵情報 RSA RSA メールでの認証やMETAタグでの認証など、任意の認証方法を選択する (ページ認証の場合、申し込み完了時に正式な埋め込みコードが表示される) 4. 支払い方法入力 クレジットカードか銀行振込を選択する 5. 確認 内容を確認し、同意して完了する 6. 完了 オーダーIDと、以降の流れが表示される 同時に「サーバ証明書お申し込み受付」メールが送信されるので確認する ページ認証の場合、以下のように埋め込みコードの案内が表示される
お申し込みありがとうございました。申請が完了しました。 オーダーIDは、XXXX0123456789です。 GSパネルにログイン後、「証明書一覧」より現在のステータス等、詳細な情報をご確認いただけます。 <meta name="_globalsign-domain-verification" content="XXXXX-XXXXX" /> 上記、ドメイン審査コードを、下記のページのgsdv.txtにテキストファイルとして設置してください。 yourdomain.com/.well-known/pki-validation/gsdv.txt お申し込み以降の流れ 証明書発行までの流れは、以下のURLよりご確認ください。 http://jp.globalsign.com/introduce/new/quickssl_page.html
■証明書インストール ※AWSでロードバランサに証明書を設定する場合の手順は aws.txt を参照 # mkdir /etc/httpd/conf/ssl.crt/ … 証明書用のディレクトリを作成 # vi /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 証明書の内容を全てコピーして貼り付ける MIIE4DCCA8igAwIBAgISESFyQfmhMxTM6H2txGeH/YImMA0GCSqGSI 〜略〜 TlmDVg== -----END CERTIFICATE-----
# vi /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 中間証明書の内容を全てコピーして貼り付ける MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQ 〜略〜 EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= -----END CERTIFICATE-----
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集(バーチャルホストを指定していない場合) # vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル編集(バーチャルホストを指定している場合。etcetera.txt も参照)
SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用の設定を確認&編集 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.20160130.key … 秘密鍵用の設定を確認&編集 SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用の設定を追加
# service httpd stop … Apacheを停止(restartでは正常に読み込まれないことがある) httpd を停止中: [ OK ] # service httpd start … Apacheを起動 httpd を起動中: [ OK ] 使ったことはないが、SSL関連の設定を書く際に以下は参考にできるかもしれない 参考:Generate Mozilla Security Recommended Web Server Configuration Files https://mozilla.github.io/server-side-tls/ssl-config-generator/ ■確認 念のため、再度opensslコマンドやhttpsアクセスでテストし、HTTP接続やSSL接続に問題がないか確認する # openssl s_client -connect refirio.net:443 -showcerts … SSLが正しく設定されているか確認 CONNECTED(00000003) depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA … CN(この場合はGlobalSign)を確認 verify return:1 depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Domain Validation CA - SHA256 - G2 verify return:1 depth=0 OU = Domain Control Validated, CN = refirio.net verify return:1 〜以下略〜 サーバに https:// でアクセスして、SSL接続に問題がないか確認する (必要に応じて、ファイヤーウォールも設定する) # service httpd restart … Apacheを再起動して、パスワードを要求されないことを確認 httpd を停止中: [ OK ] httpd を起動中: [ OK ] サイトにSSLのサイトシールを掲載する(サイトが信頼できることを示すもの) https://jp.globalsign.com/service/ssl/siteseal/ ■バーチャルホスト バーチャルホストでSSLを使用する場合は etcetera.txt も参照
■Apache+SSL(有料証明書を更新する場合)
※秘密鍵は同じものを使えるが、毎回違うものを使うほうがセキュリティ上好ましい ※万が一問題が発生しても戻せるように、以前の秘密鍵や証明書は削除せずに置いておく 参考:CSRについて教えてください。 https://jp.globalsign.com/support/faq/65.html ■CSR生成 # cd /etc/httpd/conf/ … ディレクトリ移動 # openssl genrsa -des3 -out ssl.key/refirio.net.20160130.key 2048 … 秘密鍵を生成 Generating RSA private key, 2048 bit long modulus ....+++ ......+++ e is 65537 (0x10001) Enter pass phrase for ssl.key/refirio.net.20160130.key: … 任意のパスワードを設定(表示はされない) Verifying - Enter pass phrase for ssl.key/refirio.net.20160130.key: … 任意のパスワードを確認(表示はされない) # openssl req -new -key ssl.key/refirio.net.20160130.key -out ssl.csr/refirio.net.20160130.csr … CSRを生成 Enter pass phrase for ssl.key/refirio.net.20160130.key: … 上で設定したパスワードを入力(表示はされない) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP … 国名を設定 State or Province Name (full name) []:Osaka … 都道府県名を設定 Locality Name (eg, city) [Default City]:Osaka … 市区町村名を設定 Organization Name (eg, company) [Default Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 ※新規導入の時と同じ内容でいい Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: … 空Enter An optional company name []: … 空Enter # openssl rsa -in ssl.key/refirio.net.20160130.key -out ssl.key/refirio.net.20160130.key … サーバ用秘密鍵からパスワード削除(Webサーバ起動時にパスワードを要求されないように) Enter pass phrase for refirio.net.20160130.key: … サーバ用秘密鍵・証明書作成時のパスワードを入力(表示はされない) writing RSA key # vi .ssl.csr/refirio.net.20160130.csr … CSRの内容を確認
-----BEGIN CERTIFICATE REQUEST----- MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTEVMBMG 〜省略〜 bzhh/X0SHFCYaHAHIJYLUx2Ii3265wENEwdsteXVps8zTyuKw6jZaq/1 -----END CERTIFICATE REQUEST-----
■証明書申し込み 新規に購入してもいいが、更新した方が得かも 以下はドメインキーパーで更新したときの手順メモ ドメインキーパー https://www.domain-keeper.net/usr/ssl/ にログイン →「ご利用中の証明書一覧」をクリック →対象の「更新」をクリック →内容を確認して「更新手続きに進む」をクリック →内容を確認して「次へ進む」をクリック →内容を確認して「次へ進む」をクリック →内容を確認して「次へ進む」をクリック →CSRを入力して「次へ進む」をクリック →内容を確認して「次へ進む」をクリック →認証方法で「メール認証」の「refirio@example.com」を選択して「次へ進む」をクリック →申請情報を確認して「次へ進む」をクリック ■証明書インストール ※AWSでロードバランサに証明書を設定する場合の手順は aws.txt を参照 # vi /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 証明書の内容を全てコピーして貼り付ける MIIE4DCCA8igAwIBAgISESFyQfmhMxTM6H2txGeH/YImMA0GCSqGSI 〜略〜 TlmDVg== -----END CERTIFICATE-----
# vi /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 中間証明書の内容を全てコピーして貼り付ける MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQ 〜略〜 EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= -----END CERTIFICATE-----
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集(バーチャルホストを指定していない場合) # vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル編集(バーチャルホストを指定している場合)
#SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.crt #SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.key #SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.crt SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用の設定を編集 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.20160130.key … 秘密鍵用の設定を編集 SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用の設定を追加
※万が一問題が発生しても戻せるように、削除ではなくコメントアウトにする # service httpd stop … Apacheを停止(restartでは正常に読み込まれないことがある) httpd を停止中: [ OK ] # service httpd start … Apacheを起動 httpd を起動中: [ OK ] ■確認 念のため、再度opensslコマンドやhttpsアクセスでテストし、HTTP接続やSSL接続に問題がないか確認する # openssl s_client -connect refirio.net:443 -showcerts … SSLが正しく設定されているか確認 CONNECTED(00000003) depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA … CN(この場合はGlobalSign)を確認 verify return:1 depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Domain Validation CA - SHA256 - G2 verify return:1 depth=0 OU = Domain Control Validated, CN = refirio.net verify return:1 〜以下略〜 サーバに https:// でアクセスして、SSL接続に問題がないか確認する # service httpd restart … Apacheを再起動して、パスワードを要求されないことを確認 httpd を停止中: [ OK ] httpd を起動中: [ OK ]
■Let's Encrypt(無料SSL証明書)
・Internet Security Research Group (ISRG) という公益法人が無料で提供しているSSL証明書 ・ドメイン認証(もっとも簡易な証明書)のみに対応 ・有効期限は90日だが、自動更新の設定をすることで実質無期限に使える ・現状ワイルドカードには対応していないが、複数の証明書を発行すればいいので問題にはならない (2018年1月からワイルドカードに対応する予定だったが、延期されている) ・IPアドレスに対するSSLには対応していない。ドメインが必要 ・AWSのEC2に導入することもできる 参考:無料SSL / TLSサーバー証明書「Let's Encrypt」を知っていますか? | 株式会社LIG https://liginc.co.jp/373838 参考:ネコでもわかる!さくらのVPS講座 〜第六回「無料SSL証明書 Let’s Encryptを導入しよう」 | さくらのナレッジ https://knowledge.sakura.ad.jp/10534/ 参考:Let’s EncryptのSSL証明書で、安全なウェブサイトを公開 | さくらのナレッジ https://knowledge.sakura.ad.jp/5573/ 参考:CentOS 6.7でLet's Encrypt !! - Qiita https://qiita.com/hirohiro77/items/8506493e042ddfbe6e1f 「証明書を生成する場合、一旦httpdデーモンを停止させる必要があります」 参考:CentOSにLet's EncryptのSSL証明書を導入する - オープンソースこねこね http://kohkimakimoto.hatenablog.com/entry/2016/09/15/180119 参考:Let's Encryptを使ってEC2にSSL証明書の発行から自動更新まで行う - Qiita https://qiita.com/sayama0402/items/011644191dfdbde9c646 参考:無料SSLサーバー証明書 Let's Encrypt - レンタルサーバーはさくらインターネット https://www.sakura.ne.jp/function/freessl.html 参考:【無料SSL】サーバコントロールパネルからの導入手順 - さくらのサポート情報 https://help.sakura.ad.jp/hc/ja/articles/115000136822
■Apache+PHP
※プログラミング言語PHPを導入する ※CentOS6では、未だにデフォルトでPHP5.3がインストールされる PHP5.6を使う方法は programming.txt を参照 ■インストール # yum -y install php php-mbstring php-gd … php、php-mbstring、gdをインストール # vi /etc/php.ini … phpの設定ファイルを編集
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED error_reporting = E_ALL … & ~E_NOTICE & ~E_DEPRECATED を削除 ;date.timezone = date.timezone = Asia/Tokyo … Asia/Tokyo を設定 ;mbstring.language = Japanese mbstring.language = Japanese … 行頭の ; を削除 ;mbstring.internal_encoding = EUC-JP mbstring.internal_encoding = UTF-8 … 行頭の ; を削除し、EUC-JP を UTF-8 に修正 ;mbstring.http_input = auto mbstring.http_input = pass … 行頭の ; を削除し、auto を pass に修正 ;mbstring.http_output = SJIS mbstring.http_output = pass … 行頭の ; を削除し、SJIS を pass に修正 ;mbstring.encoding_translation = Off mbstring.encoding_translation = Off … 行頭の ; を削除 ;mbstring.detect_order = auto mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII … 行頭の ; を削除し、auto を UTF-8,SJIS,EUC-JP,JIS,ASCII に修正 ;mbstring.substitute_character = none; mbstring.substitute_character = none; … 行頭の ; を削除 ;mbstring.func_overload = 0 mbstring.func_overload = 0 … 行頭の ; を削除 ;mbstring.strict_detection = Off mbstring.strict_detection = Off … 行頭の ; を削除
必要に応じて error_reporting や short_open_tag なども設定する セキュリティ対策に、expose_phpもOffにしておくと良さそう Apacheの挙動に関する設定ファイルは /etc/httpd/conf.d/php.conf に作られるので、必要に応じて編集する # service httpd restart … httpdを再起動 httpd を起動中: [ OK ] ■動作確認 公開ディレクトリ内に phpinfo.php を作成し、以下を記述する ブラウザからアクセスし、PHPの情報が表示されることを確認する <?php phpinfo() ?>
■nginx
※Apacheの代替になり得るとされているWebサーバ ※Apacheよりも大量のアクセスを捌くことができるとされている ※Basic認証やリダイレクトの方法がApacheと同じではないので注意 nginxの設定ファイルに記述する必要があり、SSHで設定再読み込みやミドルウェア再起動が発生する 参考:Nginxとは?Apacheとの違いについてエンジニアに聞いてみた https://academy.gmocloud.com/qa/20160616/2761 参考:EC2(Amazon Linux)に Nginx をインストールしてBasic認証する http://dev.classmethod.jp/etc/amazon_linux_nginx_basic_auth/ 参考:Nginxセキュリティ設定 http://qiita.com/hideji2/items/1421f9bff2a97a5e5794 参考:nginxのパラメータチューニングとh2o http://qiita.com/cubicdaiya/items/235777dc401ec419b14e 参考:Apacheからnginxへ移行する際に気になったことメモ https://qiita.com/nayuneko/items/a3b326e2e9466e4117d6 参考:Nginx導入時やること - Qiita https://qiita.com/kidach1/items/985efebba639713c562e 参考:nginxの設定ファイル nginx.conf の読み方 超入門 - 或る阿呆の記 https://hack-le.com/nginx/ 参考:Nginx設定のまとめ - Qiita https://qiita.com/syou007/items/3e2d410bbe65a364b603 参考:nginxについてまとめ(設定編) - Qiita https://qiita.com/morrr/items/7c97f0d2e46f7a8ec967 参考:nginx.confが読めるようになる | 魔法使いの卵 http://raichel.tech/web/read-nginx-conf ■インストール # yum -y install nginx … nginxをインストール # vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集
http { server_tokens off; … 追加。レスポンスにミドルウェア名とバージョンを含めないようにする
# service nginx start … nginxを起動 # chkconfig nginx on … nginxの自動起動を設定 アクセスログとエラーログは以下の場所にある /var/log/nginx/access.log /var/log/nginx/error.log ログフォーマットも /etc/nginx/nginx.conf で変更できる。以下は変更例
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ↓以下のように変更 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $http_x_forwarded_for $http_x_forwarded_proto';
参考:ELB経由のnginxでアクセス元IPアドレスをアクセスログの$remote_addrとして書くようにする - Qiita https://qiita.com/toshihirock/items/1de2613bb7c95d486dc1 参考:nginx: ログ出力形式の変更と、ログにレスポンスタイムを出力する方法 - エラーの向こうへ https://tech.mktime.com/entry/259 ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定(80ポートを開ける)
#HTTPを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 ■動作確認 # vi /usr/share/nginx/html/index.html … テストページ作成(もとのファイルを上書き)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>テスト</title> </head> <body> <p>テスト。</p> </body> </html>
http://refirio.net/ のようにブラウザからアクセスを確認 ■公開ディレクトリの変更 公開ディレクトリを変更したい場合、以下の設定を行う # vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集
server { listen 80 default_server; listen [::]:80 default_server; #server_name localhost; server_name refirio.net; … 必要に応じてサーバー名を指定 #root /usr/share/nginx/html; root /var/www/html; … 公開ディレクトリを変更
# mkdir -p /var/www/html/ … 公開用ディレクトリを作成(存在しない場合) # chown nginx. /var/www/ … 公開用ディレクトリの所有者をnginxに変更 # chmod 775 /var/www/ … nginxグループのユーザに読み書き実行を許可 # chown nginx. /var/www/html/ … ドキュメントルートの所有者を「nginx」に変更 # chmod 775 /var/www/html/ … nginxグループのユーザに読み書き実行を許可 # ll /var/www/ … ドキュメントルートの所有者を確認 合計 0 drwxrwxr-x 2 nginx nginx 6 2月 3 13:58 html # nginx -t -c /etc/nginx/nginx.conf … 設定ファイルの構文をチェック # service nginx restart … nginxを再起動 ※設定ファイルの構文チェックは、/etc/nginx/conf.d/https.conf などinclude対象のファイルをチェックすると文法エラーになる /etc/nginx/nginx.conf など、大元のファイルをチェックする必要がある
■nginx+PHP7
※FPM(FastCGI Process Manager)は、PHPのFastCGI実装のひとつ。nginxがphp-fpmと通信してPHPを実行する HHVM(HipHop Virtual Machine)というものもあり、動作が軽量らしい 参考:CentOSにてnginxでPHPを動かす http://qiita.com/utano320/items/36b6eac2bbd5bb5657f6 参考:EC2にnginx+php(php-fpm socket)環境を最速で構築 http://qiita.com/koni/items/05158e33b4c8aac07b59 参考:nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc 参考:HHVM を導入して、PHP実行環境を高速化する | しょぼんブログ https://syobon.jp/2017/01/30/hhvm-install/ 参考:さくらVPS(CentOS7)で、Nginx+PHP7.1+MariaDBのWordPressを構築(HTTPS対応) - Qiita https://qiita.com/ktkiyoshi/items/bf920b4df02d98b570e3 ■古いPHPを削除する場合の例 # yum remove php-* # yum remove php56* … 必要に応じて # yum remove php70w* … 必要に応じて # rm -rf /etc/php-fpm.d/ … 必要に応じて ■CentOS7にPHP7をインストールする場合 # yum install epel-release # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm … PHP7のリポジトリを追加 # yum -y install --enablerepo=remi-php70 php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-pdo php-xml # chkconfig php-fpm on # php -v … PHP7のインストールを確認 ■CentOS6やAmazonLinuxにPHP7をインストールする場合 # rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm … PHP7のリポジトリを追加 # yum -y install --enablerepo=webtatic-testing php70w php70w-devel php70w-fpm php70w-mysql php70w-mbstring php70w-pdo php70w-xml # chkconfig php-fpm on # php -v … PHP7のインストールを確認 PHP7.1をインストールする場合、「yum -y install」の内容を以下のようにする(「php70」を「php71w」に変更) # yum -y install --enablerepo=webtatic-testing php71w php71w-devel php71w-fpm php71w-mysql php71w-mbstring php71w-pdo php71w-xml ■セッションの設定 そのままだとセッションが使えないので調整する # chgrp nginx /var/lib/php/session … セッション置き場のグループが「apache」になっているので、「nginx」に変更 ■php-fpmの設定 # vi /etc/php-fpm.d/www.conf … php-fpmの設定ファイルを編集
;user = apache user = nginx ;group = apache group = nginx
# vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集
#index index.html index.htm; index index.php index.html index.htm; … インデックスページにPHPを追加 #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; … 公開ディレクトリのパスを設定 include fastcgi_params; }
# service php-fpm start … php-fpmを起動 # chkconfig php-fpm on … php-fpmの自動起動を設定 # nginx -t -c /etc/nginx/nginx.conf … 設定ファイルの構文をチェック # service nginx restart … nginxを再起動 これでnginxでPHPを使うことができる 必要に応じて php-mbstring や gd もインストールし、/etc/php.ini も設定する /etc/php.ini を編集した場合、以下で php-fpm を再起動する # service php-fpm restart nginxの設定方法は docker.txt も参照
■MySQL
※データベースMySQLを導入する ■古いMySQLを削除する場合の例 # yum remove mysql-* # rm -rf /var/lib/mysql/ … 必要に応じて 参考:MySQL 5.7 on CentOS7 で起動時にこける問題 - Qiita https://qiita.com/shimacpyon/items/50d9a688f88db416d518 ■全体的な設定について ※MySQL5.5.3以降なら、データベースの文字コードはutf8mb4にするといい それ以前ならutf8にするといい(utf8mb4については後述) 参考:mysqlについて、機能とかInnoDBとか文字コード等々 http://blog.cototoco.net/tag/utf8mb4/ ■MariaDBについて CentOS7ではMySQL互換のMariaDBが標準のデータベースとなっている。使い方は基本的にMySQL5.7と同じ 参考:ネコでもわかる!さくらのVPS講座 〜第四回「phpとMariaDBをインストールしよう」 http://knowledge.sakura.ad.jp/knowledge/9006/ # yum install mariadb-server # mysqld --version … 以降はMySQLと同じ ■MySQL5.7について あらかじめリポジトリの追加が必要 CentOS6やAmazonLinuxにインストールする場合のリポジトリ追加方法 # yum -y install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm ■インストール 参考:データベースサーバー構築(MySQL) http://centossrv.com/mysql.shtml 参考:第10回 yum, rpmインストールにおけるMySQL 5.6とMySQL 5.7の違い:MySQL道普請便り|gihyo.jp … 技術評論社 http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0010 # yum -y install mysql-community-server … mysql-serverをインストール(ダメな場合は「yum -y install mysql-server」とする) # mysqld --version … MySQLのインストールを確認 # service mysqld start … MySQL起動 # chkconfig mysqld on … MySQL自動起動設定 # vi /var/log/mysqld.log … MySQL初期rootパスワードを確認(MySQL5.7以降)
2018-02-02T07:44:59.173850Z 1 [Note] A temporary password is generated for root@localhost: gV0+8k6BM#z5
# vi /etc/my.cnf … MySQLの設定ファイルを編集(初回起動前に編集すると、起動時にエラーになることがある。詳細は後述)
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 character-set-server=utf8 … 追加(MySQLサーバーの文字コードをUTF-8にする) validate-password=OFF … 強力すぎるパスワードチェックを解除する場合(MySQL5.7以降)
# service mysqld restart … MySQL起動 # mysql_secure_installation … MySQL初期設定 Enter password for user root: … /var/log/mysqld.log に書かれた初期rootパスワードを入力(MySQL5.7以降) New password: … 新しいパスワードを入力(MySQL5.7以降) Re-enter new password: … 以降はMySQL5.7より前の内容だが、5.7以降でも基本的な流れは同じ NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): … 空Enter OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. Set root password? [Y/n] … 空Enter(rootパスワード設定) New password: … rootパスワード入力 Re-enter new password: … rootパスワード入力確認 Password updated successfully! Reloading privilege tables.. ... Success! By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] … 空Enter(匿名ユーザー削除) ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] … 空Enter(リモートからのrootログインを禁止) ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] … 空Enter(testデータベースを削除) - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] … 空Enter ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! ■動作確認 # mysql -u root -p … MySQLへrootでログイン Enter password: … MySQLのrootパスワードを入力 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 to server version: 4.1.12 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> GRANT ALL PRIVILEGES ON test.* TO webmaster@localhost IDENTIFIED BY 'gV0+8k6BM#z7'; … testへのすべてのアクセス権限を持った、ユーザwebmasterを作成(MySQL5.6以前) mysql> CREATE USER webmaster@localhost IDENTIFIED BY 'gV0+8k6BM#z7'; … MySQL5.7からはユーザを作成してからGRANTする必要がある mysql> GRANT ALL PRIVILEGES ON test.* TO webmaster@localhost; mysql> CREATE USER webmaster IDENTIFIED BY 'gV0+8k6BM#z7'; … 接続元を限定しない場合の指定(多くのサーバからデータベースに接続する場合など) mysql> GRANT ALL PRIVILEGES ON test.* TO webmaster; mysql> FLUSH PRIVILEGES; mysql> SET PASSWORD FOR webmaster@localhost=PASSWORD('abcd'); … webmaster@localhostのパスワードを「abcd」に変更する場合 mysql> REVOKE ALL PRIVILEGES ON test.* FROM webmaster; … webmasterユーザからtestへのアクセス権限を剥奪する場合 mysql> GRANT SELECT ON `test`.* TO viewer@localhost IDENTIFIED BY 'gV0+8k6BM#z7'; … 特定データベースのみSELECTを許可する場合 mysql> REVOKE SELECT ON `test`.* FROM viewer@localhost; … 権限を剥奪する場合 mysql> GRANT SELECT ON `test`.`sample` TO viewer@localhost IDENTIFIED BY 'gV0+8k6BM#z7'; … 特定データベースの特定テーブルのみSELECTを許可する場合 mysql> REVOKE SELECT ON `test`.`sample` FROM viewer@localhost; … 権限を剥奪する場合 mysql> SELECT host, user FROM mysql.user WHERE user='webmaster'; … webmasterユーザ登録確認 +-----------+-----------+ | host | user | +-----------+-----------+ | localhost | webmaster | +-----------+-----------+ 1 row in set (0.00 sec) mysql> SHOW GRANTS FOR 'webmaster'@'localhost'; … webmasterユーザ権限確認 +------------------------------------------------------------------------------------------------------------------+ | Grants for webmaster@localhost | +------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'webmaster'@'localhost' IDENTIFIED BY PASSWORD '*76DD0CE725E300814169889CDB512FA9DBAAB9C3' | | GRANT ALL PRIVILEGES ON `test`.* TO 'webmaster'@'localhost' | +------------------------------------------------------------------------------------------------------------------+ 7 rows in set (0.00 sec) mysql> exit … ログアウト Bye # mysql -u webmaster -p … webmasterユーザでMySQLサーバーへログイン Enter password: … webmasterのパスワードを入力 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 to server version: 4.1.12 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE DATABASE test; … testデータベース作成(文字コードを指定しない場合) mysql> CREATE DATABASE test DEFAULT CHARACTER SET utf8; … testデータベース作成(文字コードを指定する場合) Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES; … データベース作成確認 +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.01 sec) mysql> USE test … testデータベースへ接続 Database changed mysql> exit … ログアウト Bye ■PHPから接続 # yum -y install php-mysql … php-mysqlをインストール(PHP5の場合で、PDOをインストールしていない場合) # yum -y install --enablerepo=webtatic-testing php70w-pdo … php-mysqlをインストール(CentOS6やAmazonLinuxにPHP7をインストールした場合で、PDOをインストールしていない場合) # service httpd restart … httpdを再起動 httpd を起動中: [ OK ] # vi /var/www/html/mysql.php … 動作確認用にプログラムを作成
<?php try { $pdo = new PDO( 'mysql:dbname=test;host=localhost', 'webmaster', 'gV0+8k6BM#z7' ); $stmt = $pdo->query('SELECT NOW() AS now;'); $data = $stmt->fetch(PDO::FETCH_ASSOC); echo "<p>" . $data['now'] . "</p>\n"; } catch (PDOException $e) { exit($e->getMessage()); } $pdo = null;
※スロークエリの設定も行っておくといい。次回設定時に追記する ■アクセス権限の追加について 参考:MySQLのGRANT(権限)の追加/削除/確認 http://takuya-1st.hatenablog.jp/entry/2015/03/22/120618 mysql> SHOW GRANTS FOR webmaster; … webmasterユーザの権限を確認 +-----------------------------------------------------------------------+ | Grants for webmaster@% | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'webmaster'@'%' IDENTIFIED BY PASSWORD <secret> | | GRANT ALL PRIVILEGES ON `test`.* TO 'webmaster'@'%' | +-----------------------------------------------------------------------+ 2 rows in set (0.01 sec) mysql> GRANT ALL PRIVILEGES ON sample.* TO webmaster; … webmasterユーザにsampleデータベースの権限を追加 Query OK, 0 rows affected (0.02 sec) mysql> SHOW GRANTS FOR webmaster; … webmasterユーザの権限を再度確認 +-----------------------------------------------------------------------+ | Grants for webmaster@% | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'webmaster'@'%' IDENTIFIED BY PASSWORD <secret> | | GRANT ALL PRIVILEGES ON `test`.* TO 'webmaster'@'%' | | GRANT ALL PRIVILEGES ON `sample`.* TO 'webmaster'@'%' | +-----------------------------------------------------------------------+ 3 rows in set (0.01 sec) ■utf8mb4の使用について 設定ファイルの /etc/my.cnf で以下のように文字コードを設定しておく これでutf8mb4のテーブルを扱うことができる(MySQL5.5.3以降) character-set-server=utf8mb4 以下のようにテーブルを作成すると文字コードがutf8mb4になる CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; 以下のようにテーブルを作成すると文字コードがutf8になる 4バイト文字を登録すると「?」と表示される CREATE TABLE char_test( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', text VARCHAR(255) NOT NULL COMMENT 'テキスト', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '文字コードテスト'; INSERT INTO char_test(text) VALUES('4バイト文字を含むテキスト'); 以下のようにテーブルを作成すると文字コードがutf8mb4になる 4バイト文字を登録するとそのまま扱える PHPからMySQLに接続する際、「SET NAMES utf8mb4」としておく CREATE TABLE char_test( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', text VARCHAR(255) NOT NULL COMMENT 'テキスト', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '文字コードテスト'; INSERT INTO char_test(text) VALUES('4バイト文字を含むテキスト'); ローカル環境のXAMPPでデータベースを作成する場合、 普段 utf8_general_ci にしていたので utf8mb4_general_ci とした 参考:MySQL で utf8 と utf8mb4 の混在で起きること http://tmtms.hatenablog.com/entry/2016/09/06/mysql-utf8 参考:MySQLの文字コードをutf8mb4に変更 http://qiita.com/deco/items/bfa125ae45c16811536a ■起動時のエラーについて MySQL5.7では、my.cnf を編集してから起動すると何故かエラーになる my.cnf を編集せずに起動し、その後 my.cnf を編集してから restart すると何故か大丈夫 (いったんエラーになった場合、MySQLを削除してからインストールしなおすといい) 以下はエラーになったときのメッセージ # service mysqld start MySQL データベースを初期化中: 2018-02-17T06:34:54.109416Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-02-17T06:34:54.110978Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting. 2018-02-17T06:34:54.111088Z 0 [ERROR] Aborting [失敗]
■PostgreSQL
※データベースPostgreSQLを導入する ■インストール 参考:yumによるRPMパッケージのアンインストール http://fedorasrv.com/memo/log/37.shtml 参考:PostgreSQL インストール http://www.server-world.info/query?os=CentOS_6&p=postgresql 参考:PostgreSQL 9.3をCentOS 6.5へインストールして初期設定 http://ossfan.net/setup/postgresql-20.html 参考:データベースサーバの構築(PostgreSQL) http://kajuhome.com/postgresql.shtml 参考:CentOSでPostgreSQL!一般ユーザ用のDBを作って操作する方法! http://senoway.hatenablog.com/entry/2013/09/21/231706 # rpm -q postgresql … 古いPostgreSQLを削除する場合 postgresql-8.4.20-1.el6_5.x86_64 # yum remove postgresql # yum -y install postgresql-server … postgresql-serverをインストール # service postgresql initdb … データベース初期化 データベースを初期化中: [ OK ] # vi /var/lib/pgsql/data/postgresql.conf … PostgreSQLの設定ファイルを編集
# 59行目:コメント解除して変更(他ホストからのアクセスも受け付ける場合) listen_addresses = '*' # 334行目:コメント解除して変更(ログの形式を [日時 ユーザー DB 〜]とする) log_line_prefix = '%t %u %d '
# service postgresql start … PostgreSQL起動 postgresql サービスを開始中: [ OK ] # chkconfig postgresql on … PostgreSQL自動起動設定 ■動作確認 ※OSのユーザとPostgreSQLのユーザが一致している必要があるため、あらかじめOSのユーザを作成しておく # useradd webmaster … 一般ユーザ「webmaster」を作成(作成していない場合) # passwd webmaster … 「webmaster」のパスワードを設定(作成していない場合) # su - postgres … postgres ユーザーにスイッチしてパスワード設定 (postgresユーザはPostgreSQLインストール時に自動的に作成される) -bash-4.1$ psql -c "ALTER USER postgres WITH PASSWORD '1234'" ALTER ROLE -bash-4.1$ createuser webmaster … DBユーザー「webmaster」を新規登録 Shall the new role be a superuser? (y/n) y# DBの管理者権限を与える場合は「y」 # su - webmaster … webmasterユーザに切り替え $ createdb test … testデータベースを作成 $ psql -l … データベース作成確認 $ psql test … testデータベースに接続 psql (8.4.20) "help" でヘルプを表示します. test=# ALTER USER webmaster WITH PASSWORD '1234'; … ユーザにパスワードを設定 ALTER ROLE test=# CREATE TABLE test(no INT, name TEXT); … テーブルを作成&テスト CREATE TABLE test=# INSERT INTO test VALUES(1, 'taro'); INSERT 0 1 test=# SELECT * FROM test; no | name ----+------ 1 | taro (1 行) test=# DROP TABLE test; DROP TABLE test=# \q … ログアウト ■PHPから接続 ※設定しないと、PHPから接続した時に「Ident認証に失敗しました」となる 「Linux上のアカウントとPostgreSQLのアカウントが一致しないとエラーにする」という設定で、あらかじめ設定されているもの PHPはapache権限で実行されるため、ユーザが異なるとみなされる 参考:CentOS で PostgreSQL を使ってみよう!(2) http://lets.postgresql.jp/documents/tutorial/centos/2 # vi /var/lib/pgsql/data/pg_hba.conf … クライアント認証ファイルを編集
# "local" is for Unix domain socket connections only … 丸ごとコメントアウト #local all all ident # IPv4 local connections: #host all all 127.0.0.1/32 ident # IPv6 local connections: #host all all ::1/128 ident local all all trust … 代わりに以下の設定を追加 host all all 127.0.0.1/32 trust host all all ::1/128 trust host all all 0.0.0.0/0 password
※スロークエリの設定も行っておく。次回設定時に追記する
■FTPD
※FTPサーバを構築する ※SSHでもファイルを転送できる(SFTP)ので必須ではない ■インストール 参考:FTPサーバー構築(vsftpd) http://centossrv.com/vsftpd.shtml 参考:さくらのVPSを使ってみる【9】-vsftpdをインストールしてみる http://pro-grammer.info/archives/902 # yum -y install vsftpd … vsftpdインストール # vi /etc/vsftpd/vsftpd.conf … vsftpd設定ファイル編集
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO … anonymousユーザ(匿名ユーザ)のログイン禁止 # Activate logging of uploads/downloads. xferlog_enable=YES … /var/log/vsftpd.logに接続・転送を記録(1/3) # You may override where the log file goes if you like. The default is shown # below. xferlog_file=/var/log/vsftpd.log … /var/log/vsftpd.logに接続・転送を記録(2/3) # If you want, you can have your log file in standard ftpd xferlog format xferlog_std_format=NO … /var/log/vsftpd.logに接続・転送を記録(3/3) # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. ascii_upload_enable=YES … アスキーモードでのアップロードを許可 ascii_download_enable=YES … アスキーモードでのダウンロードを許可 # You may fully customise the login banner string: ftpd_banner=Welcome to blah FTP service. … FTPログイン時にソフト名とバージョンが表示されないようにする # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). chroot_local_user=YES … デフォルトでホームディレクトリより上層へのアクセスを禁止する chroot_list_enable=YES … 上層へのアクセスを許可するユーザを作成する場合 # (default follows) chroot_list_file=/etc/vsftpd/chroot_list … 上層へのアクセスを許可するユーザを作成する場合 # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. ls_recurse_enable=YES … ディレクトリごと削除できるようにする
# echo username >> /etc/vsftpd/chroot_list … FTPサーバーへのアクセスを禁止するユーザを登録する場合 # touch /etc/vsftpd/chroot_list … 登録が不要な場合でも、ファイルは作成しておく # service vsftpd start … vsftpdを起動 vsftpd 用の vsftpd を起動中: [ OK ] # chkconfig vsftpd on … vsftpdの自動起動を設定 ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定
#FTPを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 ■動作確認(FTP用ユーザを作成) ※SSHでのログインが禁止された、ホームディレクトリが /var/www のユーザを作成するものとする ※apacheグループを使うかは運用によって検討 webmasterグループなどを作って使うと、Apacheから公開フォルダ内にファイルを作成する場合に保存できない? nginxを使っている場合、nginxグループに所属させればいい # adduser --shell /sbin/nologin --home /var/www username1 … ユーザを作成 # adduser --shell /sbin/nologin --home /var/www username2 # usermod -a -G apache username1 … ユーザをapacheグループに追加 # usermod -a -G apache username2 # passwd username1 … ユーザにパスワードを設定 # passwd username2 FTPソフトから、以下の設定で接続できる プロトコル: FTP ホスト: サーバのIPアドレス、もしくはドメイン 暗号化: なし ユーザ名: 設定したユーザ名 パスワード: 設定したパスワード ※必要なら接続元IP制限を行う ※userlistを使えばブラックリスト形式、ホワイトリスト形式のいずれかでFTPアクセスを許可するユーザを指定できる ユーザは /etc/vsftpd/user_list で指定できる ■PASVモードで接続する ※要検証 # vi /etc/vsftpd/vsftpd.conf … vsftpd設定ファイル編集
# 以下を最後に追加 #pasv_addr_resolve=YES … PASVモード接続先IPアドレスをホスト名から取得する(要検証) #pasv_address=refirio.net … PASVモード接続先IPアドレスが牽けるホスト名(要検証) #pasv_min_port=60000 … PASVモード接続時の最小ポート番号(要検証) #pasv_max_port=60030 … PASVモード接続時の最大ポート番号(要検証)
# service vsftpd start … vsftpdを再起動 # vi /etc/sysconfig/iptables … ファイヤーウォールを設定
#FTPを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 60000:60030 -j ACCEPT … 追加
# service iptables restart … ファイヤーウォールを再起動 ※PASVモードで接続できている?pasv_min_portなどをコメントアウトしても接続できているような?要検証 ※ファイヤーウォールは21番ポートを開けるのみで通信できた 60000〜60030なしで繋がるということは、PASVモードになっていない?要検証 要検証 : iptableでpassiveFTPを許可する場合(SFTPを使用する場合は不要) http://www.geocities.jp/gronlijus/skill/linux/linux-iptables-ftp.html ■FTPSで接続する ※要検証 # vi /etc/vsftpd/vsftpd.conf … vsftpd設定ファイル編集
# 以下を最後に追加 #ssl_enable=YES … SSLの有効化(要検証) #rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem … サーバー証明書を指定(要検証 / ファイルは後の手順で作成) #force_local_logins_ssl=NO … ログイン時にSSL接続を強制しない場合(要検証) #force_local_data_ssl=NO … データ転送時にSSL接続を強制しない場合(要検証)
# cd /etc/pki/tls/certs/ … ディレクトリ移動 # make vsftpd.pem … サーバー証明書作成(要検証 / ssl_enable=YES にしない場合は不要のはず) umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:1024 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ; \ cat $PEM1 > vsftpd.pem ; \ echo "" >> vsftpd.pem ; \ cat $PEM2 >> vsftpd.pem ; \ rm -f $PEM1 $PEM2 Generating a 1024 bit RSA private key .................................++++++ ................................++++++ writing new private key to '/tmp/openssl.OH7090' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP … 国名を設定 State or Province Name (full name) [Berkshire]:Tokyo … 都道府県名を設定 Locality Name (eg, city) [Newbury]:Shibuya … 市区町村名を設定 Organization Name (eg, company) [My Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 # service vsftpd start … vsftpdを再起動 ※現状FTPSで接続できない。要検証 参考:vsftpdでSSLによる暗号化通信を利用できるように設定 | WEBサービス創造記 http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/ftp/vsftpd%E3%81%A7%E3%81%AEssl%... ■FTPをSSHで代用(SFTP) ※要検証 通常の使用は問題ないが、アクセスを特定ディレクトリ内に限定したい場合に厄介 chrootを使う必要があるが、必要な命令のコピーが必要(未検証) 参考:sshログインしたユーザのディレクトリを制限するには。 - 春木屋 http://d.hatena.ne.jp/flageo/20090215/p1