カテゴリー: Server

CentOS7でwebサーバの初期設定

はじめに

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でインストールすることもできないようです。

$ 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 package dnf available.
Error: Nothing to do

ということで、RPMを直接ダウンロードしてインストールします。
参考:CentOS 7.2でdnfを使う方法

$ 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.rpm dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.4-2.sdl7.noarch.rpm

以後はdnfを使っていきます。yumと同じような感じで使えます。

SSH設定

ユーザー作成・設定

# ユーザー作成
useradd testuser
# パスワード設定
passwd testuser
# sudoできるように
usermod -G wheel testuser
# wheelグループであれば全コマンドが使えるようにする
visudo
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL <= この行がコメントアウトされている場合は、コメントアウトを外す

ローカル側で鍵作成

cd ~/.ssh/
ssh-keygen -t rsa -b 4096 -f hoge_rsa

パスなしで作成します(何も入力せずEnterでOK)。
hoge_rsaとhoge_rsa.pubが作成されるので.pubの方をリモートにアップロードします。
scp -P ポート番号 ローカルからアップロードしたいファイルのパス ユーザ名@リモートのホスト名:リモートのコピー先ディレクトリ

サーバにアップロードした公開鍵をリネーム

su testuser
mkdir ~/.ssh
cd ~/.ssh
cat hoge_rsa.pub > authorized_keys
rm -rf hoge_rsa.pub
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

sshd_config編集

sudo vi /etc/ssh/sshd_config

# ポートを変えておく
# ウェルノウンポート(0〜1023)と、サーバに入っているサービスが使っているポート(例:MySQLなら3306)を避けます。
# 私は大体いつも20000番台で設定しています。
#Port 22
Port 23456

# 以下の行のコメントアウトを外して有効化する
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys

# 以下は無効化する
PermitRootLogin no
PasswordAuthentication no

ここまでやったらsshdを再起動します。
sudo systemctl restart sshd

サービスの自動起動は最後にまとめて設定します。

ファイアウォールの設定変更

参考:CentOS7でSSHのポート番号を変更する

# 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番を開放します。

$ 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インストール&実行

$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
$ sudo chmod 700 /usr/bin/certbot-auto
$ sudo certbot-auto certonly --webroot -w /var/www/html -d test.com --email 任意のメールアドレス

let’s encryptで取得した証明書の期限は3ヶ月なので、定期的(ここでは毎月1日の04:00)に更新するようにcronを設定します。

$ sudo crontab -e
00 04 01 * * /usr/bin/certbot-auto renew --force-renew && systemctl reload httpd

正常に終了していれば、公開鍵ファイルが生成されています。

$ sudo ls -l /etc/letsencrypt/live/test.com/
lrwxrwxrwx 1 root root  40 42  6月 25 01:05 cert.pem -> ../../archive/test.com/cert1.pem
lrwxrwxrwx 1 root root  41 42  6月 25 01:05 chain.pem -> ../../archive/test.com/chain1.pem
lrwxrwxrwx 1 root root  45 42  6月 25 01:05 fullchain.pem -> ../../archive/test.com/fullchain1.pem
lrwxrwxrwx 1 root root  43 42  6月 25 01:05 privkey.pem -> ../../archive/test.com/privkey1.pem

ssl.conf編集

以前にも紹介した「Mozilla SSL Configuration Generator」が便利です。

httpd2.4.33 + openssl1.0.2k + Modern(セキュリティ強め設定、要件次第では不要かも)

$ 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

SSLProtocolSSLCipherSuiteはVirtualHostディレクティブの外で設定しましょう。

サービスの自動起動設定

サーバが再起動した際、自動でサービスが立ち上がるようにします。

  • CentOS6まで:chkconfig サービス名 on
  • CentOS7:systemctl enable サービス名.service

.serviceは省略してもいいようです。

$ sudo systemctl enable sshd
$ sudo systemctl enable httpd
$ sudo systemctl enable crond

確認コマンドは下記の通りです。enabledになっていればOKです。

$ sudo systemctl list-unit-files -t service
crond.service                                 enabled
httpd.service                                 enabled
sshd.service                                  enabled

httpsで接続確認

ブラウザで再度アクセスしてみます。
ssl.confでStrict-Transport-Securityが有効になっていれば、http接続しても強制的にhttpsにリダイレクトされます。
It works!が出てくればOKです。お疲れ様でした。

さいごに

いかがでしたしょうか。元々あったCentOS6向けの自分用メモを更新して、その内容を一部改変し、説明を付け足した感じです。ある程度は定型的な作業になると思いますので、こうやって手順を整理して、サクサクできるように心がけています。

nomura

シェア
執筆者:
nomura

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前