■目次
Apache独自ドメインApache+SSL(有料証明書なしでSSLを導入する場合)Apache+SSL(有料証明書でSSLを導入する場合)Apache+SSL(有料証明書を更新する場合)Let's Encrypt(無料SSL証明書)Apache+PHPnginxnginx+PHP7MySQLPostgreSQLFTPDFTPDの設定(所有者と権限の設定例)FTPDの設定(ホームディレクトリより上位へのアクセスを禁止する場合)FTPDの設定(FTPSでの接続)FTPDトラブルFTPDその他
■Apache
※Webサーバを構築して、サーバにブラウザからアクセスできるようにする ※IPアドレスでアクセスしたときはIPアドレスもしくはサーバ名だけが表示されるページにアクセス、 ドメインを指定してアクセスしたら対応するページにアクセス…とすると管理しやすいかも 「IPアドレス + /phpmyadmin/」などへの無差別アクセスと攻撃下調べの影響も、若干軽減できる ※バーチャルホストが不要な案件でも、後々検収環境が追加されたりを想定して、常にバーチャルホストにしておくといいかも バーチャルホストの設定方法は Etcetera.txt を参照 ※バーチャルホストにした場合、access_log にサブドメインが残らないのでページを判別しづらい (リファラには表示されるが、外部からアクセスされたときなどはダメ) サブドメイン名を記録するか、サブドメインごとにログファイルを分けておいた方が良さそう ※PHP5.6を使うならApacheは2.4をインストールする。詳細は Programming.txt を参照 なお Amazon Linux 2 の場合でも、Extrasリポジトリではなく通常の手順でインストールできる Amazon Linux2でLAMP環境を構築 - Qiita https://qiita.com/RayDoe/items/fb3e0ef69b9b4132e7f7 Amazon Linux 2にLAMP環境インストール - Qiita https://qiita.com/cherubim1111/items/4a89856e743f287c599f ■インストール Webサーバー構築(Apache) http://centossrv.com/apache.shtml # yum -y install httpd … httpdをインストール(PHP5.6を使うならApacheは2.4をインストールする) # 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 … 設定ファイルの構文をチェック Syntax OK # systemctl start httpd … httpdを起動 # systemctl enable httpd … httpdの自動起動を設定 # httpd -v … 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/ のようにブラウザからアクセスを確認
■独自ドメイン
以下はムームードメインで設定する例 ムームードメイン → ドメイン一覧 → (ドメインを選択) → ネームサーバ設定変更 → セットアップ → カスタム設定 → 設定2 名前 種別 内容 A 203.0.113.1 www A 203.0.113.1 しばらく待って、サーバに独自ドメインでアクセスできることを確認する EC2とムームードメインで独自ドメイン運用【ムームーDNSで簡単設定】 http://hivecolor.com/id/3
■Apache+SSL(有料証明書なしでSSLを導入する場合)
※暗号化して通信する ※有料証明書なしでSSLを導入するのは、あくまでも開発用途など 本番環境なら、後述の「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 オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている http://d.hatena.ne.jp/ozuma/20130511/1368284304 # 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/localhost.crt SSLCertificateFile /etc/pki/tls/certs/server.crt … サーバ用証明書を指定 #SSLCertificateKeyFile /etc/pki/tls/private/localhost.key SSLCertificateKeyFile /etc/pki/tls/certs/server.key … サーバー用秘密鍵を指定 #DocumentRoot "/var/www/html" DocumentRoot "/var/www/html" … #を削除(コメントを解除) #SSLProtocol all -SSLv2 SSLProtocol all -SSLv2 -SSLv3 … SSLv2、SSLv3を無効化する(POODLE SSLv3.0 脆弱性問題対処) #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:!RC4:!3DES:!RSA … RC4暗号化を外す(弱い暗号を除外 / ここでの指定でいいかは検証したい)
# service httpd configtest … 設定ファイルの構文をチェック # systemctl restart httpd … 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 ※証明書の期限は大抵「1年」「2年」など選択できるが、2020年9月1日以降は1年の期限にするべきか 今後はSafariでエラーになる可能性がある 更新の際に状況を再度確認する https://webtan.impress.co.jp/e/2020/04/10/35728 https://ssl.sakura.ad.jp/column/safari-shortening/ https://www.orangeitems.com/entry/2020/04/11/115401 ■インストール(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インストール # systemctl restart httpd … Apacheを再起動 ■SSL証明書発行(GMOグローバルサインの例) ※以降は有料の証明書を導入する場合 秘密鍵 … refirio.net.20160130.key … 流出してはいけない鍵ファイル CSR … refirio.net.20160130.csr … 証明書を発行するための署名要求(Certificate Signing Request)。秘密鍵があれば、CSRは何度でも生成できる。公開鍵、発行者情報やコモンネーム(FQDN)、電子署名(もとのCSRをハッシュ化し、さらに秘密鍵で暗号化したもの)が含まれる 証明書 … refirio.net.20160130.crt … 認証局から発行されるSSL証明書。CSRをもとに発行される 中間証明書 … refirio.net.20160130.ca … 認証局から発行されるSSL証明書。証明書に階層構造を持たせることにより、認証局が攻撃されたときの影響を抑えている [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で複数回の申込みを受け付けないところもあるので、毎回秘密鍵から作る方がいい 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----- ※大抵の解説で「パスワードありの秘密鍵を作成し、その後秘密鍵からパスワードを削除する」としている解説が多いのでそうしている ただし以下のように、はじめからパスワードなしの秘密鍵を作成している解説もある パスワードを削除するなら、はじめからパスワードなしで作っても良さそう 検証したい CSR情報の生成方法 | エンジョイSSLダイレクト https://www.e-ssldirect.com/order/createcsr.shtml CSRの生成手順 Apache + ModSSL + OpenSSL - Q&A - SSLOFF https://www.ssloff.com/members/knowledgebase.php?action=displayarticle&id=1 ■CSRの生成 # 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 … 空Enter(もしくは管理者メールアドレスを設定) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: … 空Enter An optional company name []: … 空Enter ※クイック認証の場合、管理者メールアドレスは不要みたい ※ドメイン refirio.net を保持しているとして、サブドメイン secure.refirio.net で利用するとして、 サーバが複数台構成のために web1.refirio.net のような名前の場合、 「Common Name」には「secure.refirio.net」を入力する。つまり、あくまでも「ブラウザでサーバにアクセスする際に入力するURL」となる (SSLは「このURLにアクセスしたいけど、このサイトは本物か?」を証明するためのものなので) ワイルドカード証明書を申し込む場合、「*.refirio.net」のように入力する コモンネームについて教えてください。 https://jp.globalsign.com/support/faq/67.html ■秘密鍵からパスワードを削除 # 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
なおGlobalSignで 「証明書一覧 → 編集 → メール送信一覧」 から、送信されたメールを確認できる(承認リンクや証明書なども確認できる) ■証明書申し込み(ドメインキーパーでCSRありの例) ドメインキーパー https://www.domain-keeper.net/usr/ssl/ にログイン →「新規申込」をクリック →内容を確認して「各サービス規約および注意事項に同意する」にチェックを入れて「承諾する」をクリック →コモンネームに「www.refirio.net」と入力して、「クイック認証」をクリック ・ドメイン名ではなくコモンネームなので注意 ・ワイルドカード証明書の場合は *.refirio.net のようになるので注意。また、ワイルドカードのページ認証は www.refirio.net ではなく refirio.net で行うので注意 →取得年数で「1年」を選択して「次へ進む」をクリック →「オプションサービスを申し込む」の内容を確認する。今回は「CSR発行サービス 」を選択して「次へ進む」をクリック →CSR情報を入力して「次へ進む」をクリック。以下は入力内容 Organization(組織名): refirio.net Organization Unit(部署名): Locality(市区町村): Shibuya State(都道府県): Tokyo Country(国コード): JP →認証方法で「DNS認証希望」を選択して「次へ進む」をクリック →申請情報を入力して「次へ進む」をクリック。以下は入力内容 組織名: 株式会社テスト 部署名: 担当者氏名: 山田 太郎 担当者氏名(英字): Yamada Taro 電話番号: 090-1234-5678 →確認画面が表示されるので、「この内容で申し込む」をクリック →完了画面が表示され、秘密鍵の内容が表示されるので保存しておく →「お申し込みありがとうございます」のメールが届くので、いったん待つ ■証明書インストール ※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/refirio.net.20160130.ca … 中間証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 中間証明書の内容を全てコピーして貼り付ける MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQ 〜略〜 EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= -----END CERTIFICATE-----
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集 バーチャルホストを指定している場合、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/refirio.net.20160130.ca … 中間証明書用の設定を追加 #DocumentRoot "/var/www/html" DocumentRoot "/var/www/html" … #を削除(コメントを解除) #SSLProtocol all -SSLv2 SSLProtocol all -SSLv2 -SSLv3 … SSLv2、SSLv3を無効化する(POODLE SSLv3.0 脆弱性問題対処) #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:!RC4:!3DES:!RSA … RC4暗号化を外す(弱い暗号を除外 / ここでの指定でいいかは検証したい)
# systemctl stop httpd … Apacheを停止(restartでは正常に読み込まれないことがある) # systemctl start httpd … Apacheを起動 使ったことはないが、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接続に問題がないか確認する (必要に応じて、ファイヤーウォールも設定する) # systemctl restart httpd … Apacheを再起動して、パスワードを要求されないことを確認 サイトにSSLのサイトシールを掲載する(サイトが信頼できることを示すもの) https://jp.globalsign.com/service/ssl/siteseal/ ■バーチャルホスト バーチャルホストでSSLを使用する場合は Etcetera.txt も参照
■Apache+SSL(有料証明書を更新する場合)
※秘密鍵は同じものを使えるが、毎回違うものを使うほうがセキュリティ上好ましい ※万が一問題が発生しても戻せるように、以前の秘密鍵や証明書は削除せずに置いておく CSRについて教えてください。 https://jp.globalsign.com/support/faq/65.html ■秘密鍵の生成 # 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: … 任意のパスワードを確認(表示はされない) ■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) []: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を入力して「次へ進む」をクリック →CSRの内容を確認して「次へ進む」をクリック →認証方法で「メール認証」の「refirio@example.com」を選択して「次へ進む」をクリック →申請情報を確認して「次へ進む」をクリック →申し込み内容を確認して「次へ進む」をクリック →引き続き決済を行う ■証明書申し込み(グローバルサインでページ認証の例) 新規に購入してもいいが、更新した方が得かも。手続きもスムーズ 以下はドメインキーパーで更新したときの手順メモ グローバルサイン https://system.globalsign.com/loginpartner/loginpartner.do にログイン →「現在更新可能な証明書」をクリック →対象の「更新」をクリック →サービス内容を選択して「次へ」をクリック →技術担当者情報を入力して「次へ」をクリック →CSRを入力して「次へ」をクリック →CSR内容を確認して「次へ」をクリック →認証方法で「ページ認証」を選択して「次へ」をクリック →支払い方法で「クレジットカード」を選択して「次へ」をクリック →申込内容を確認して「完了する」をクリック 以下のように表示されているので、該当サーバにファイルを設置する
オーダーIDは、CEDO123456789012です。 GSパネルにログイン後、「証明書一覧」より現在のステータス等、詳細な情報をご確認いただけます。 <meta name="_globalsign-domain-verification" content="XXXXXXXXXXXXXXXXXXXXXXX-YY_ZZZZZZZZZZZZZZZ" /> 上記、ドメイン審査コードを、下記のページのgsdv.txtにテキストファイルとして設置してください。 yourdomain.com/.well-known/pki-validation/gsdv.txt
→「グローバルサイン/承認手続きのお知らせ」というメールが送られてくるはずなので、メールの案内に従って該当ページにアクセスし、承認手続きを行う もしくはGlobalSignで 「証明書一覧 → 編集 → メール送信一覧」 から、送信されたメールを確認できる(承認リンクや証明書なども確認できる) ■証明書インストール ※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/refirio.net.20160130.ca … 中間証明書用のファイルを作成
-----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/refirio.net.ca 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/refirio.net.20160130.ca … 中間証明書用の設定を追加
※万が一問題が発生しても戻せるように、削除ではなくコメントアウトにする # systemctl stop httpd … Apacheを停止(restartでは正常に読み込まれないことがある) # systemctl start httpd … Apacheを起動 ■確認 念のため、再度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接続に問題がないか確認する # systemctl restart httpd … Apacheを再起動して、パスワードを要求されないことを確認
■Let's Encrypt(無料SSL証明書)
・Internet Security Research Group (ISRG) という公益法人が無料で提供しているSSL証明書 ・ドメイン認証(もっとも簡易な証明書)のみに対応 ・有効期限は90日だが、自動更新の設定をすることで実質無期限に使える ・現在はワイルドカードにも対応している ・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でのLet's Encrypt運用が簡単になりました https://blogs.osdn.jp/2019/07/10/lets-encrypt.html
■Apache+PHP
※プログラミング言語PHPを導入する ※CentOS6では、未だにデフォルトでPHP5.3がインストールされる PHP5.6を使う方法は Programming.txt を参照 PHP7を使う方法は、このファイルの「nginx+PHP7」を参照 ■インストール # 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 に作られるので、必要に応じて編集する # systemctl restart httpd … httpdを再起動 ■動作確認 公開ディレクトリ内に 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 ■インストール ※Amazon Linux 2にインストールする場合の手順は後述 # yum -y install nginx … nginxをインストール # vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集
http { server_tokens off; … 追加。レスポンスにミドルウェア名とバージョンを含めないようにする
# service nginx start … nginxを起動 # chkconfig nginx on … nginxの自動起動を設定 # nginx -v … 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 ■インストール(Amazon Linux 2 の場合) Amazon Linux 2 の場合、Extrasリポジトリからインストールする必要がある # amazon-linux-extras list # amazon-linux-extras install nginx1.12 -y # systemctl start nginx # systemctl enable nginx AmazonLinux2にNginxを導入する - Qiita https://qiita.com/ashbrain/items/4de51ff33e4bddf1278b ■ファイヤーウォール設定(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 # vi /var/www/html/index.html … トップページを作成(適当な内容を記述しておく) # service nginx configtest … 設定ファイルの構文をチェック(「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 -y install epel-release … EPELのリポジトリを追加 # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm … Remiのリポジトリを追加 # 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 … RemiのリポジトリからPHP7をインストール # chkconfig php-fpm on # php -v … PHP7のインストールを確認 ■AmazonLinux2にPHP7をインストールする場合 # amazon-linux-extras install php7.3 -y … ExtrasリポジトリからPHP7を追加 # yum -y install php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-pdo php-xml # 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の自動起動を設定 # service nginx configtest … 設定ファイルの構文をチェック # 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が標準のデータベースとなっている 使い方は基本的にMySQLと同じで、オープンソースのデータベース MariaDBはMySQLの作者によって、MySQLのソースコードをベースに作成されている MySQLはサン・マイクロシステムズ社に買収されたが、開発指針の相違などから作者がサン・マイクロシステムズ社を退社し、MariaDBの作成を始めた ネコでもわかる!さくらのVPS講座 〜第四回「phpとMariaDBをインストールしよう」 http://knowledge.sakura.ad.jp/knowledge/9006/ CentOS7にyumでMariaDB最新版インストール - Qiita https://qiita.com/ys-0-sy/items/f7e316f8dd84a386e82e MariaDBは以下のようにすればインストールでき、以降はMySQLと同じように扱える ただしAmazonLinux2の場合、yum ではなく amazon-linux-extras でインストールする方が新しいバージョンになるので検討する # yum -y install mariadb-server # mysqld --version … 以降はMySQLと同じ(エラーになる場合は「mysql --version」とする) # systemctl start mariadb # systemctl enable mariadb 2021年9月時点で、CentOS7では上記手順でインストールするとバージョン5.5.68がインストールされた ただしバージョン5.5は2020年4月11日でサポートが終了されているようなので、今後のためにも新しいバージョンを使用するのが良さそう 以下のようにMariaDBのリポジトリを追加することで、バージョン10.6.4がインストールされた # curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash # yum install MariaDB-server MariaDB-client # systemctl start mariadb # systemctl enable mariadb CentOS 7 に MariaDB Community Server 最新版をインストール | MariaDB https://mariadb.com/ja/resources/blog/install-mariadb-server-centos7/ CentOS7にyumでMariaDB最新版インストール - Qiita https://qiita.com/ys-0-sy/items/f7e316f8dd84a386e82e CentOS7へMariaDBをインストールしよう - @HIROSKI work fields https://www.hiroski.com/2020/04/202004-mariadb-install.html インストール直後、データベースには以下でroot接続できた (「sudo」を指定しないと接続できなかった) $ sudo mysql -u root 以下を参考に、この制限は解除できそう (未検証) MariaDB/rootでログインできない場合の設定 - 調べる.DB https://db.just4fun.biz/?MariaDB/root%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D... MariaDBは、バージョン5.1から5.5までは、同じバージョン番号のMySQLの非商用版を一部改良した形でリリースしていたが、 MySQL5.5をベースにMySQL5.6から新機能の選択的な追加とMariaDB独自の機能追加を実施するという方針変更を行い、 2014年3月31日に新たにバージョン番号を10に変更したバージョンをリリースした 以降は10.1、10.2のようなバージョン番号となっている MariaDBとMySQLのバージョン対応は以下のとおり
MySQL MariaDB 5.5 5.5 / 10.0 5.6 10.1 5.7 10.2
MariaDB - Wikipedia https://ja.wikipedia.org/wiki/MariaDB MariaDB と MySQL のソースコードの類似度を調べる | スマートスタイル TECH BLOG|データベース&クラウドの最新技術情報を配信 https://www.s-style.co.jp/blog/2018/04/1709/ ■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 MySQL - MacPortsにあるmysql57とmysql57-serverとの違いは?|teratail https://teratail.com/questions/38678 # yum -y install mysql-community-server … mysql-serverをインストール(利用できない場合は「yum -y install mysql-server」とする) # mysqld --version … MySQLのインストールを確認(エラーになる場合は「mysql --version」とする) # 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> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, EVENT ON test.* TO webmaster@localhost; … 環境によっては「ALL PRIVILEGES」で一括指定するとエラーになるので、必要なものを個別に指定する 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 ■テーブル操作の動作確認 CREATE TABLE table_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 table_test(text) VALUES('テストメッセージ1'); INSERT INTO table_test(text) VALUES('テストメッセージ2'); ■PHPから接続 PHPインストール時の内容によって、インストールすべきものが変わるので注意 # yum -y install --enablerepo=remi-php73 php-mysql … MySQLドライバをインストール(RemiリポジトリからPHP7.3をインストールした場合) # yum -y install --enablerepo=remi-php73 php-pdo … PDOをインストール(RemiリポジトリからPHP7.3をインストールした場合) # yum -y install php-mysql … MySQLドライバをインストール(PHP5の場合) # yum -y install --enablerepo=webtatic-testing php70w-pdo … PODをインストール(WebtaticリポジトリからにPHP7.0をインストールした場合) # systemctl restart httpd … httpdを再起動 # 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"; $pdo = null; } catch (PDOException $e) { exit($e->getMessage()); }
※スロークエリの設定も行っておくといい。次回設定時に追記する ■アクセス権限の追加について 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」のパスワードを設定(作成していない場合) ※引き続き、PostgreSQLのユーザとデータベースを作成 # 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」 -bash-4.2$ createdb test … testデータベースを作成 ※作成したユーザで接続テスト # su - webmaster … webmasterユーザに切り替え $ 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, '山田太郎'); INSERT 0 1 test=> INSERT INTO test VALUES(2, '山田花子'); INSERT 0 1 test=# SELECT * FROM test; no | name ----+---------- 1 | 山田太郎 (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
※スロークエリの設定も行っておく。次回設定時に追記する ■PHPから接続テスト # vi /var/www/html/pgsql.php
<?php try { $pdo = new PDO( 'pgsql:dbname=test;host=localhost', 'webmaster', '1234' ); $stmt = $pdo->query('SELECT NOW() AS now;'); $data = $stmt->fetch(PDO::FETCH_ASSOC); echo "<p>" . $data['now'] . "</p>\n"; $pdo = null; } catch (PDOException $e) { exit($e->getMessage()); }
■EUC_JPのデータベースを作成 psql -l … データベースの文字コードを確認 dropdb test … 一旦testデータベースを削除する場合 createdb -E EUC_JP --locale=ja_JP.EUC_JP test --template=template0 … 文字コードを指定してtestデータベースを作成 PostgreSQLのinitdbと違うロケールでDB作成 http://wsjp.blogspot.jp/2012/04/postgresqlinitdbdb.html PostgreSQLエラー「createdb: データベースの生成に失敗しました: ERROR: 符号化方式 EUC_JP がロケール ja_JP.UTF-8 に合いません」の原因と解決方法 http://nobuneko.com/blog/archives/2011/10/postgresqlcreatedb_error_euc_j.html 以下、「他にこのデータベースを使っている 1 個のセッションがあります。」のように表示された場合の対象方法 アクセスしているユーザを調べて強制的に追い出す psql test … testデータベースに接続 SELECT * FROM pg_stat_activity; … アクセスしているユーザを調べる SELECT pg_terminate_backend(567) FROM pg_stat_activity WHERE usename = 'usename'; … procidとusernameを指定して追い出す \q … ログアウト 具体例 SELECT pg_terminate_backend(7960) FROM pg_stat_activity WHERE usename = 'postgres'; SELECT pg_terminate_backend(5484) FROM pg_stat_activity WHERE usename = 'postgres'; SELECT pg_terminate_backend(7404) FROM pg_stat_activity WHERE usename = 'postgres'; 「WHERE usename = 'postgres'」は無くても大丈夫かも?
■FTPD
※FTPサーバを構築する ※SSHでもファイルを転送できる(SFTP)ので、FTPDは必須ではない EC2にvsftpをセッティングする際のハマリポイント - Qiita https://qiita.com/dogyear/items/289b314db9af42e15cfa vsftpdの設定(vsftpd.conf) http://www.nina.jp/server/redhat/vsftpd/vsftpd.conf.html [AWS] EC2でFTPを使いたい - Qiita https://qiita.com/Yuki_BB3/items/deeb84c360c6f3c37f51 【AWS】AWSでFTPサーバー立てる時に気をつけるべき2つのこと+α | DevelopersIO https://dev.classmethod.jp/articles/to-be-aware-of-when-settingup-ftpserver-with-aws/ VPSにFTPを可能にするVsftpd設定 | WEB担当者の備忘録 https://liapoc.com/vsftpd.html 【AWS】閉域網のEC2にFTPサーバーを構築 - Hanatare's PaPa https://www.hanatare-papa.jp/entry/technology-aws-ftp-1 AWS EC2でWebサーバーを立てる - Qiita https://qiita.com/niyute/items/ea02d93fa3a5ee2868d7 FTPでの接続には、パッシブモードとアクティブモードがある パッシブモードはアクティブモードの欠点をカバーする接続方法 特に理由が無ければパッシブモードを使えばいいので、この解説でもパッシブモードを前提とする FTPのアクティブモードとパッシブモードの違いを徹底解説!|ITトレンド https://it-trend.jp/file_transfer/article/104-0006 FTPにおけるアクティブモードとパッシブモードの違い http://cos.linux-dvr.biz/archives/131 ■ポート番号の確認 現在利用できるポートを確認する この範囲内でパッシブモード接続用のポート番号を決定する $ cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 今回は以下の範囲を使用するとする(毎回この値で設定して問題ないはず) 60001〜60010 ■FTPDをインストール # yum -y install vsftpd # vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO … 匿名ユーザーのログインは許可しない dirmessage_enable=NO … 新しいディレクトリに初めて移動してもメッセージは表示しない connect_from_port_20=NO … アクティブモードを無効にする xferlog_enable=YES … ログを記録する xferlog_file=/var/log/vsftpd.log … ログを記録するファイル xferlog_std_format=NO … wu-ftpdではなく,vsftpdログ形式でログを記録する ascii_upload_enable=YES … アスキーモードのアップロードを有効にする ascii_download_enable=YES … アスキーモードのダウンロードを有効にする ftpd_banner=Welcome to blah FTP service. … ログイン時にソフト名とバージョンが表示されないようにする ls_recurse_enable=YES … 「ls -R」コマンド(ディレクトリリストを再帰的に表示)の使用を許可する # ファイルの最後にある設定 pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=NO … 変更(ホストへのアクセスを制御しない / EC2の場合はセキュリティグループで設定する) # ファイルの最後に追加する設定 use_localtime=YES … ローカルタイムを使用する(デフォルトはGMT) force_dot_files=YES … .(ドット)で始まるファイルを表示する pasv_enable=YES … パッシブモードを有効にする pasv_addr_resolve=YES … パッシブモード接続先IPアドレスをホスト名から取得する pasv_address=52.194.248.37 … サーバのグローバルIPアドレス pasv_min_port=60001 … パッシブモード接続で使用するポート番号の最小値 pasv_max_port=60010 … パッシブモード接続で使用するポート番号の最大値
pasv_addressには、そのサーバのグローバルIPアドレスを設定する 「pasv_addr_resolve=YES」なら、「refirio.net」のようにホスト名を設定してもいい EC2にvsftpをセッティングする際のハマリポイント - Qiita https://qiita.com/dogyear/items/289b314db9af42e15cfa 【AWS】AWSでFTPサーバー立てる時に気をつけるべき2つのこと+α | DevelopersIO https://dev.classmethod.jp/articles/to-be-aware-of-when-settingup-ftpserver-with-aws/ # systemctl start vsftpd # systemctl enable vsftpd SSHでログインしない、つまり「--shell /sbin/nologin」を指定したユーザのFTP接続を許可するため、以下の指定を行う # vi /etc/shells
/sbin/nologin … ファイルの最後に追加
■FTPD用ユーザを作成 SSHでのログインを許可しない、ホームディレクトリが「/var/www」のユーザを作成する場合 (ホームページ更新用なら、基本的にこの方法で作成するといい) # adduser --shell /sbin/nologin --home /var/www username1 # usermod -a -G apache username1 # passwd username1 abcd1234 上記の制限を行わないユーザを作成する場合 (ホームディレクトリは「/home/ユーザ名」になる) # adduser username2 # usermod -a -G apache username2 # passwd username2 abcd1234 ■ポートを開放 セキュリティグループで21番ポートを開放しておく ソースは、可能なら「203.0.113.1/32」などのようにIP制限をかけておく ポート範囲 ソース 21 0.0.0.0/0 60000 - 60010 0.0.0.0/0 EC2にvsftpをセッティングする際のハマリポイント - Qiita https://qiita.com/dogyear/items/289b314db9af42e15cfa CentOS6環境の場合、以下のように設定する # 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:60010 -j ACCEPT … 追加
# service iptables restart … ファイヤーウォールを再起動 ■FTPDの接続テスト FileZillaから以下でFTPアクセスを試す プロトコル: FTP ホスト: 192.168.33.10(接続先のIPアドレス) 暗号化: なし ユーザ名: username1 パスワード: abcd1234 転送モード: デフォルト 暗号化は、 「使用可能なら明示的な FTP over TLS を使用」もしくは 「平文の FTP のみを使用する(安全でない)」を選択する EC2環境の場合、転送モードが「デフォルト」もしくは「パッシブ」にすると接続できた 「アクティブ」だと、以下のエラーになって接続できなかった
状態: サーバーはルーティング不可能なアドレスでパッシブ応答を送信しました。代わりにサーバーのアドレスを使用します。 コマンド: LIST エラー: 非アクティブになってから 20 秒後に接続がタイムアウトになりました エラー: ディレクトリ リスト表示の取り出しに失敗しました
なお、設定を変更して再接続テストする場合、FTPソフトの再起動を行うこと 前回接続したときの情報がキャッシュされているようで、接続できない設定でも接続できているように見えることがある
■FTPDの設定(所有者と権限の設定例)
※実際にWordPressなど複雑なプログラムを設置し、問題ないかを確認する 複数人で作業することを想定して、所有者と権限を調整する また、FTPソフトで作成したファイルとApache(PHP)で作成したファイルを、相互に編集できるようにする ■変更前の挙動 username1(FTPソフト)が作成したファイルは以下となる 所有者 ... username1:username1 権限 ... 644 username1(FTPソフト)が作成したディレクトリは以下となる 所有者 ... username1:username1 権限 ... 755 username2(FTPソフト)が作成したファイルは以下となる 所有者 ... username2:username2 権限 ... 644 username2(FTPソフト)が作成したディレクトリは以下となる 所有者 ... username2:username2 権限 ... 755 Apache(PHP)が作成したファイルは以下となる 所有者 ... apache:apache 権限 ... 644 Apache(PHP)が作成したディレクトリは以下となる 所有者 ... apache:apache 権限 ... 755(作成時に指定する) ■変更後の挙動 username1(FTPソフト)が作成したファイルは以下となる 所有者 ... username1:apache 権限 ... 664 username1(FTPソフト)が作成したディレクトリは以下となる 所有者 ... username1:apache 権限 ... 775 username2(FTPソフト)が作成したファイルは以下となる 所有者 ... username2:apache 権限 ... 664 username2(FTPソフト)が作成したディレクトリは以下となる 所有者 ... username2:apache 権限 ... 775 Apache(PHP)が作成したファイルは以下となる 所有者 ... apache:apache 権限 ... 664 Apache(PHP)が作成したディレクトリは以下となる 所有者 ... apache:apache 権限 ... 775(作成時に指定する) ■具体的な設定 FTPソフトで作成する際の、ファイルの権限を変更する (VSFTPDの設定ファイルを編集する) # vi /etc/vsftpd/vsftpd.conf
local_umask=022 ↓ local_umask=002
# systemctl restart vsftpd Apache(PHP)で作成する際の、ファイルの権限を変更する (ファイルを新規に作成し、umaskの設定を記述する) # vi /etc/systemd/system/httpd.service
.include /lib/systemd/system/httpd.service [Service] UMask=002
# systemctl --system daemon-reload # systemctl restart httpd ディレクトリにsetgidを設定し、上位ディレクトリのグループを引き継ぐようにする # chmod g+s /var/www # chmod g+s /var/www/html これで「変更後の挙動」になる ただ、例えばFTP経由でディレクトリを作成し、パーミッションの変更画面を開き、何も変更せずにOKとすると drwxrwsr-x ↓ drwxrwxr-x のようにパーミッションが変更されてしまう(「s」が無くなる) 問題になることは少ないかもしれないが、良い解決方法があるか引き続き確認したい
■FTPDの設定(ホームディレクトリより上位へのアクセスを禁止する場合)
デフォルトの設定では、FTPで「/var/www」「/home/username1」などにアクセスしたあとに上位のディレクトリへ移動できる これを、接続時にアクセスした場所がFTPソフト側で「/」と表示されるようにし、上位ディレクトリへの移動を禁止する (実際にアクセスしている場所は変更されない) # vi /etc/vsftpd/vsftpd.conf
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES
# touch /etc/vsftpd/chroot_list … 上層へのアクセスを許可するユーザを登録するファイルを作成しておく # systemctl restart vsftpd # vi /etc/vsftpd/chroot_list … 上層へのアクセスを許可するユーザを登録する場合
username1 … ファイルに追加
EC2にvsftpをセッティングする際のハマリポイント - Qiita https://qiita.com/dogyear/items/289b314db9af42e15cfa FTPで特定のユーザに上位ディレクトリを見せないための設定 - Qiita https://qiita.com/kenichiro-yamato/items/08aa845b61804373d739
■FTPDの設定(FTPSでの接続)
FTPで接続する際に暗号化通信を使用する EC2をFTPS化する方法 - Qiita https://qiita.com/Itaru7/items/c7b1c42e1da4dfe084a6 【vsftpd】FTPをSSL/TLSで暗号化する設定 - Qiita https://qiita.com/aqmr-kino/items/ad80258eacd69a78064c CentOS7でFTPサーバ構築してみた | Developers.IO https://dev.classmethod.jp/articles/vsftpd_on_centos7/ CentOS7でFTPSを設定してみた | Developers.IO https://dev.classmethod.jp/articles/ftps_on_centos7/ 【CentOS】vsftpdでFTPSを構築しSSL暗号化通信の設定をする(証明書作成) - 中堅プログラマーの備忘録 https://www.chuken-engineer.com/entry/2019/09/05/141448 FTPSにおけるexplicit(明示モード)とimplicit(暗黙モード)の違い http://tooljp.com/windows/doc/ftp-over-tls-Implicit-explicit/ftp-over-tls-Implicit-explicit.html ■証明書の作成 # cd /etc/pki/tls/certs # make vsftpd.pem umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \ cat $PEM1 > vsftpd.pem ; \ echo "" >> vsftpd.pem ; \ cat $PEM2 >> vsftpd.pem ; \ rm -f $PEM1 $PEM2 Generating a 2048 bit RSA private key .........................+++ .................................................+++ writing new private key to '/tmp/openssl.jhViOW' ----- 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 … 管理者メールアドレスを設定 ■設定の変更 # vi /etc/vsftpd/vsftpd.conf
ssl_enable=YES ssl_request_cert=NO #require_cert=NO ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1=YES ssl_tlsv1_1=YES ssl_tlsv1_2=YES force_local_data_ssl=YES force_local_logins_ssl=YES syslog_enable=YES debug_ssl=YES rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem rsa_private_key_file=/etc/pki/tls/certs/vsftpd.pem
# systemctl restart vsftpd ■接続 FTPソフトの接続設定で、暗号化の項目で 「使用可能なら明示的な FTP over TLS を使用」もしくは 「明示的な FTP over TLS が必要」を選択する 接続時に「サーバーの証明書は不明です」や「証明書は自己署名です」などが表示されるが、問題無いので証明書を信用して接続する ■メモ 接続する人は限られているので、本番環境でも自己署名の証明書で問題無い? 証明書の期限(365日)が切れると接続できなくなる?その場合、同じ手順で証明書を再発行すればいい? 要確認
■FTPDトラブル
■FTPソフトから接続すると「致命的なエラー: サーバーに接続できません」となる FileZillaから、以下のエラーでアクセスできず
状態: 192.168.33.10:21 に接続中... 状態: 接続を確立しました。ウェルカム メッセージを待っています... 状態: 平文での FTP は安全ではありません。FTP over TLS に切り替えてください。 コマンド: USER username1 レスポンス: 331 Please specify the password. コマンド: PASS ******** レスポンス: 530 Login incorrect. エラー: 致命的なエラー: サーバーに接続できません
以下でnologinでのFTP接続を許可する必要があった vi /etc/shells
/sbin/nologin
最近のnologinは/etc/shellsに含まれていない - Qiita https://qiita.com/Marukaziler/items/51da64b8935444c1d9e7 ■FTPソフトから接続すると「500 OOPS: vsftpd: refusing to run with writable root inside chroot()」となる /etc/vsftpd/vsftpd.conf で以下の設定が必要だった
allow_writeable_chroot=YES
環境によってはさらに、/etc/vsftpd/vsftpd.conf で以下の設定も必要になることがあるらしい
seccomp_sandbox=NO
vsftpdの設定で謎のエラーにハマった - TomoProgの技術書 https://tomoprog.hatenablog.com/entry/2016/03/02/010729 vsftpdを設定した - Qiita https://qiita.com/tukiyo3/items/5360e74eff80c894dfae CentOS7でFTPサーバ構築 | n-portal https://n-portal.com/system/centos7ftp ■Apache(PHP)で作成するファイルの権限を変更できない CentOS7では /etc/systemd/system/httpd.service で設定するが、 CentOS6では /etc/sysconfig/httpd で設定する(書き方も異なる) 以下はCentOS6での設定方法 # vi /etc/sysconfig/httpd
umask 002
なお、CentOS7では「systemctl --system daemon-reload」も実行しないと反映されなかった CentOS7でApacheのumaskを変更する | ハックノート https://hacknote.jp/archives/21231/
■FTPDその他
■SFTPでの接続 ※検証中 Basis.txt の「ホームディレクトリより上層へのアクセスを禁止する」にchrootの検証内容がある SFTPでchrootで /var/www 内を更新できるか /var/www 内に apache ユーザの鍵が作られるなら、デプロイなどに支障が出るか と思ったが、apache ユーザの鍵は今は /usr/share/httpd/.ssh に作られるみたい(Vagrantでも同様かは確認する) それなら /var/www/main をホームディレクトリとして、ここに鍵を作ってchrootにすれば大丈夫かも どうしても難しければ、素直にFTP(FTPS)を使うべきか 以下は参考になりそう ただしやはり /var/www/main の所有者をrootにする必要がありそう /var/www の所有者をrootにして、main の所有者を作業ユーザにして…だと、バーチャルホストでの切り分けが難しくなりそう SFTPを用いて特定ユーザをchrootする方法 - Qiita https://qiita.com/kite_999/items/b8c2e6ffcc05dbe5ed66 SFTPでのみアクセスできるユーザーの作成 - Qiita https://qiita.com/kenta8813/items/57f00f7dbb48326c5cef SFTP用ユーザのchroot環境の構築 - sanosoft @ ウィキ - アットウィキ https://w.atwiki.jp/sanosoft/pages/75.html /var/www/main はそのまま残しておいて、 案件名が test だとして、/var/www/test の所有者をrootにして、ここをchrootの場所にして、/var/www/test/web の所有者を作業ユーザにして、 /var/www/test/web/html を公開ディレクトリにするか www の中に web という名前のフォルダを作るのは微妙な気がするので、上記構成でいいとしても命名は検討したい もしくは /var/test の所有者をrootにして、ここをchrootの場所にして、/var/test/www の所有者を作業ユーザにして、 /var/test/www/html を公開ディレクトリにするか ここはselinuxが有効でも大丈夫な場所か、などは確認しておきたい ■複数台サーバでの稼働 ※未検証 rsyncするユーザでrsyncコマンドのみsudoで動かせるようにして、 root権限で同期すれば所有者と権限も引き継がれるみたい?