はじめに
CentOSでのサーバ構築は6までしか経験してなかったのですが、今後建てるなら7でしょ、ということで手順をまとめてみます。
設定内容
VPSでCentOS7を選び、webサーバとして最低限の機能を構築することを想定しています。
- 必要なパッケージをインストール
- SSH設定
- httpd2.4 + let’s encryptでhttps接続
必要なパッケージをインストール
まずはカーネルその他諸々アップデート
yum -y install yum-priorities yum-fastestmirror
yum update
dnf
yumの後継として、Fedoraでは22以降で標準になっているパッケージ管理システムです。
CentOS7でも使えますが、標準では入っておらず、yumでインストールすることもできないようです。
1 2 3 4 5 6 7 8 9 | $yum install--enablerepo=epel dnf Loaded plugins:fastestmirror,priorities Loading mirror speeds from cached hostfile *base:ftp.riken.jp *epel:ftp.riken.jp *extras:ftp.riken.jp *updates:ftp.riken.jp No packagednf available. Error:Nothing todo |
ということで、RPMを直接ダウンロードしてインストールします。
参考:CentOS 7.2でdnfを使う方法
1 2 3 4 | $wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm $wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm $wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm $yum install python-dnf-0.6.4-2.sdl7.noarch.rpmdnf-0.6.4-2.sdl7.noarch.rpmdnf-conf-0.6.4-2.sdl7.noarch.rpm |
以後はdnfを使っていきます。yumと同じような感じで使えます。
SSH設定
ユーザー作成・設定
1 2 3 4 5 6 7 8 9 10 | # ユーザー作成 useradd testuser # パスワード設定 passwd testuser # sudoできるように usermod-Gwheel testuser # wheelグループであれば全コマンドが使えるようにする visudo ## Allows people in group wheel to run all commands # %wheel ALL=(ALL) ALL <= この行がコメントアウトされている場合は、コメントアウトを外す |
ローカル側で鍵作成
1 2 | cd~/.ssh/ ssh-keygen-trsa-b4096-fhoge_rsa |
パスなしで作成します(何も入力せずEnterでOK)。
hoge_rsaとhoge_rsa.pubが作成されるので.pubの方をリモートにアップロードします。scp -P ポート番号 ローカルからアップロードしたいファイルのパス ユーザ名@リモートのホスト名:リモートのコピー先ディレクトリ
サーバにアップロードした公開鍵をリネーム
1 2 3 4 5 6 7 | su testuser mkdir~/.ssh cd~/.ssh cat hoge_rsa.pub>authorized_keys rm-rf hoge_rsa.pub chmod700~/.ssh chmod600~/.ssh/authorized_keys |
sshd_config編集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sudo vi/etc/ssh/sshd_config # ポートを変えておく # ウェルノウンポート(0〜1023)と、サーバに入っているサービスが使っているポート(例:MySQLなら3306)を避けます。 # 私は大体いつも20000番台で設定しています。 #Port 22 Port23456 # 以下の行のコメントアウトを外して有効化する #PubkeyAuthentication yes #AuthorizedKeysFile .ssh/authorized_keys # 以下は無効化する PermitRootLogin no PasswordAuthentication no |
ここまでやったらsshdを再起動します。sudo systemctl restart sshd
サービスの自動起動は最後にまとめて設定します。
ファイアウォールの設定変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # firewalldの設定からSSHを削除 $sudo firewall-cmd--permanent--remove-service=ssh # firewalldに新しいssh設定を追加する $sudo cp/usr/lib/firewalld/services/ssh.xml/etc/firewalld/services/ssh.xml # ファイル内のポート番号を変更する $sudo vi/etc/firewalld/services/ssh.xml <port protocol="tcp"port="22"/> ↓ <port protocol="tcp"port="23456"/> # 新しいssh設定を追加して、ファイアウォール再起動 $sudo firewall-cmd--permanent--add-service=ssh $sudo firewall-cmd--reload |
ローカルから鍵認証でSSHログインできるかを確認します。ssh -p 23456 -i ~/.ssh/hoge_rsa xxx@xxx.xxx.xxx.xxx
httpd2.4
インストール
Baseリポジトリには2.4系の古いバージョンしかないので、最新バージョンを扱うリポジトリを登録します。
参考:CentOS7にApache2.4最新版をyum installするdnf -y install https://centos7.iuscommunity.org/ius-release.rpm
iusリポジトリに無いが、httpdインストール時に必要となるパッケージをBaseリポジトリから入れておきます。dnf install expat-devel libdb-devel cyrus-sasl-devel
これで準備完了です。httpdの古いバージョンが入ることを防ぐため、Baseリポジトリを無効化してインストールします(ついでにopensslとmod_sslも)。dnf install --disablerepo=base --enablerepo=ius httpd-devel openssl-devel mod_ssl
ファイアウォール設定
httpで80番、httpsは443番を開放します。
1 2 3 4 5 6 | $sudo firewall-cmd--permanent--add-service=http $sudo firewall-cmd--permanent--add-service=https $sudo firewall-cmd--reload # httpd起動 $systemctl start httpd |
ここまででhttp接続はできるようになっているはずです。ブラウザでアクセスして、おなじみのIt works!
が表示されればOKです。
let’s encryptでhttps化
certbotインストール&実行
1 2 3 | $sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto $sudo chmod700/usr/bin/certbot-auto $sudo certbot-auto certonly--webroot-w/var/www/html-dtest.com--email任意のメールアドレス |
let’s encryptで取得した証明書の期限は3ヶ月なので、定期的(ここでは毎月1日の04:00)に更新するようにcronを設定します。
1 2 | $sudo crontab-e 000401**/usr/bin/certbot-auto renew--force-renew&&systemctl reload httpd |
正常に終了していれば、公開鍵ファイルが生成されています。
1 2 3 4 5 | $sudo ls-l/etc/letsencrypt/live/test.com/ lrwxrwxrwx1root root 4042 6月2501:05cert.pem->../../archive/test.com/cert1.pem lrwxrwxrwx1root root 4142 6月2501:05chain.pem->../../archive/test.com/chain1.pem lrwxrwxrwx1root root 4542 6月2501:05fullchain.pem->../../archive/test.com/fullchain1.pem lrwxrwxrwx1root root 4342 6月2501:05privkey.pem->../../archive/test.com/privkey1.pem |
ssl.conf編集
以前にも紹介した「Mozilla SSL Configuration Generator」が便利です。
httpd2.4.33 + openssl1.0.2k + Modern(セキュリティ強め設定、要件次第では不要かも)
1 2 3 4 5 | $sudo vi/etc/httpd/conf.d/ssl.conf # certbotが生成した公開鍵のパスを記述します SSLCertificateFile/etc/letsencrypt/live/test.com/cert.pem SSLCertificateKeyFile/etc/letsencrypt/live/test.com/privkey.pem SSLCertificateChainFile/etc/letsencrypt/live/test.com/fullchain.pem |
※ SSLProtocol
、SSLCipherSuite
はVirtualHostディレクティブの外で設定しましょう。
サービスの自動起動設定
サーバが再起動した際、自動でサービスが立ち上がるようにします。
- CentOS6まで:
chkconfig サービス名 on
- CentOS7:
systemctl enable サービス名.service
.serviceは省略してもいいようです。
1 2 3 | $sudo systemctl enable sshd $sudo systemctl enable httpd $sudo systemctl enable crond |
確認コマンドは下記の通りです。enabled
になっていればOKです。
1 2 3 4 | $sudo systemctl list-unit-files-tservice crond.service enabled httpd.service enabled sshd.service enabled |
httpsで接続確認
ブラウザで再度アクセスしてみます。
ssl.confでStrict-Transport-Security
が有効になっていれば、http接続しても強制的にhttpsにリダイレクトされます。It works!
が出てくればOKです。お疲れ様でした。
さいごに
いかがでしたしょうか。元々あったCentOS6向けの自分用メモを更新して、その内容を一部改変し、説明を付け足した感じです。ある程度は定型的な作業になると思いますので、こうやって手順を整理して、サクサクできるように心がけています。