CentOSはRHEL系のLinuxディストリビューションの1つで,商標や商用パッケージ等を除去したものです.
企業等を対象としたOSとの互換性の高さに優れます.
このページでは,CentOS 8のセットアップについて記録しています.

目次

  1. アップデート
  2. rootでのログイン禁止
  3. ユーザーの切替え
    1. ログイン後にrootになる
    2. sudoコマンド
    3. chown・chmodコマンド
  4. パスワード認証から鍵認証に変更
    1. 鍵の生成
    2. 鍵の配送
    3. パーミッションの設定
    4. ログインのテスト
    5. コンフィグ
  5. 日本語環境
  6. エイリアスを作成
  7. サーバーの利用
    1. Apache
    2. nginx
    3. FTP
    4. 複数サイトで鍵認証を使い分ける
  8. 参考文献

アップデート

OSをインストールして管理者権限のあるrootでパスワードによるログインを行なったら,OSアップデートのため,

dnf update

とします.
(CentOS 7系では,インストールに使うコマンドはdnfでなくyumでした.CentOS 8でyumを呼ぶとdnfになります.)

なお,日常的に最小のアップグレードを行うにはdnf upgrade-minimalです.

rootでのログイン禁止

あらゆる操作を行うことのできるrootは乗っ取られると大変なので,rootでアクセスしなくて済むようにユーザーを作成し,rootでログインすることを直ちに禁止します.

まず,ユーザー作成は次の様式で行います.

adduser USER_NAME
passwd USER_NAME

passwdコマンドで引数にユーザー名を指定すると,パスワード入力画面となりますので,登録したいパスワードを入力してください.

次に,rootでのログインを禁止するため,/etc/ssh/sshd_configを編集します.

vi /etc/ssh/sshd_config

とします.
開かれたコンフィグで,次のように1箇所yesからnoへ修正します.

PermitRootLogin no

設定を変更したら,

systemctl restart sshd

としてその設定を有効化します.

以降はssh USER_NAME@IP_ADDRESSでログインします.

ユーザーの切替え

ログイン後にrootになる

rootでないユーザーでログインした場合,

su -

でrootに切替えることができます.
(ちなみに,特定のユーザーに切替えたいならsu - ユーザー名とします.)

sudoコマンド

rootの権限はあまりに強すぎるので,rootでないユーザーがrootを擬制することのできるsudoコマンドを使用すべきです.
ユーザーをsudoできるようにするために,rootで

visudo

というコマンドを使用します.
これは/etc/sudoersを編集するコマンドで,

root ALL=(ALL) ALL

とあるところを

ユーザー名 ALL=(ALL) ALL

のように加筆または変更することで,ユーザーがsudoできるようになります.
もしsudoの都度パスワードを入力するのが面倒であるなら,安全性に欠けますが,

ユーザー名 ALL=(ALL) NOPASSWD: ALL

とすることで,パスワードが省略可能になります.

chown・chmodコマンド

さて,通常のユーザーに戻ったとしましょう.
ファイルの所有者を変更する場合だと,

sudo chown ユーザ名 ファイル

とします.
パーミッションを変更するには,

sudo chmod パーミッション ファイル

です.

chown -Rchmod -Rのようにオプションを付けて実行することで,ディレクトリの所有者やパーミッションを再起的に変更することができます.

上の例はrootで

chown ユーザ名 ファイル
chmod パーミッション ファイル

とするのと変わりません.
以下,sudoは省略して記述します.

パスワード認証から鍵認証に変更

現在,ユーザーはパスワードログインとなっていますので,パスワードより強度の高いログイン方法に変更します.

鍵の生成

ローカルで

ssh-keygen

とすると,以下が表示されますので,エンターで先に進めます.

Enter file in which to save the key (鍵の保存場所): #問題なければエンター
Enter passphrase (empty for no passphrase): #空白にするのでそのままエンター
Enter same passphrase again: #エンター

これで秘密鍵id_rsaと公開鍵id_rsa.pubができました.

鍵の配送

(デフォルトのまま公開鍵がid_rsa.pubと名付けられているなら)サーバに鍵を渡すため,

ssh-copy-id -i ~/.ssh/id_rsa.pub USER_NAME@IP_ADDRESS:~

あるいは

scp ~/.ssh/id_rsa.pub USER_NAME@IP_ADDRESS:~

とします.
これでサーバーのユーザーアカウントのトップ(~)に公開鍵が配送されました.

パーミッションの設定

この鍵にパーミッションを設定します.

cd ~
mkdir .ssh # .sshディレクトリの作成
chmod 700 .ssh # .sshディレクトリのオーナーのみ読み書き実行が可能とする
mv id_rsa.pub .ssh/authorized_keys # 公開鍵を.sshディレクトリにauthorized_keysへリネームして移す.
chmod 600 .ssh/authorized_keys # 鍵のオーナーのみ読み書き可能とする

もし別のユーザーを経由して鍵を受け取っていた場合には,

cd ~
chown -R .ssh

.ssh以下のディレクトリ・ファイルを自分のものにしておきます.

ログインのテスト

sshコマンドのオプション’i’を使い,鍵によるログインを実際に行なってみます.

ssh -i ~/.ssh/id_rsa USER_NAME@IP_ADDRESS  #DNSサーバの設定が済んでいるなら,IP_ADDRESSに代えてexample.comでよい.

コンフィグ

鍵でログインできることを確認したら,パスワードによるログインを無効にします.
rootから

vi /etc/ssh/sshd_config

として,

PasswordAuthentication no
PubkeyAuthentication yes

と設定を変更し,

systemctl restart sshd

でSSHのデーモンを再起動します.
以上で,鍵でログインする方式へ変更されました.

日本語環境

ヘルプを読むときのため,日本語の環境にします.

dnf -y install langpacks-ja
localectl set-locale LANG=ja_JP.UTF-8

エイリアスを作成

よく使うコマンドのエイリアスを作成します.
シェルとしてbashを使っているなら,ユーザーのホームディレクトリ~にある.bashrcファイルを編集(または作成)します.
.bashrcは対話型シェルが開かれるたびに読み込まれるファイルです.

vi ~/.bashrc

そして,このファイルに次を追記します.

alias エイリアス名="実行コマンド"

例えば,ls -alllという省略名を与えたいのであれば,

alias ll="ls -al"

です.

サーバーの利用

以下,サーバーを利用する若干の例です.

Apache

Apacheによりwebサーバーを立てる例です.
DNSサーバの設定は済ませておくものとします.

http使用のため,

dnf install httpd
systemctl start httpd
systemctl enable httpd

ファイアウォールのため,

dnf install firewalld
firewall-cmd --add-service={http,https} --zone=public --permanent
systemctl restart firewalld

とします.
(ファイアウォールを除去するときは--remove-service,確認は--list-servicesです.)

コンテンツを置く場所を,デフォルトの/var/www/htmlディレクトリにするなら

cd /var/www
chown USER_NAME:USER_NAME html
chmod 775 html

として,コンテンツを配備します.
これでhttpの設定ができました.

次に,httpsによるセキュアな通信を行うため,

dnf install mod_ssl

とします.
Let’s Encryptを利用するとすれば,dnf install wgetしておいた上で,

cd /tmp
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 755 /usr/local/bin/certbot-auto
/usr/local/bin/certbot-auto certonly --webroot -w /var/www/html/example.com -d example.com --email info@example.com

として,証明書とコンテンツの紐付けのために/etc/httpd/conf.d/example.com.confに次を書き込みます.

<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/html"

<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>

ErrorLog logs/example.com.jp-error_log
CustomLog logs/example.com-access_log combined
</VirtualHost>

<VirtualHost *:443>
SSLEngine on
ServerName example.com
DocumentRoot "/var/www/html"
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>

ErrorLog logs/example.com-ssl-error_log
CustomLog logs/example.com-ssl-access_log combined
</VirtualHost>

また,コンテンツ中でindex.htmlが見当たらなかったときに開かれるwelcome.confを,(再生成されうるファイルの削除ではなく)コメントアウトによって停止しておくとよいでしょう.

設定が済んだら,

systemctl restart httpd

によりhttpdを再起動します.

Let’s Encryptは有効期限がありますが,

certbot renew

のcronを設定しておくと手間がかかりません.

なお,CentOS 7ではdnfでなくyumでした.
Let’s Encryptを利用するとき,CentOS 7ではcertbotコマンドがすぐインストールできて,

yum install certbot python2-certbot-apache
certbot --apache -d example.com
systemctl restart httpd

とできました.

nginx

webサーバーとしてnginxを利用する場合の手順です.

公式に従いnginxをインストールするため,

yum install yum-utils

とした上で,/etc/yum.repos.d/nginx.repoを次のように作成します.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

そして,nginxのインストールを行います.

yum-config-manager --enable nginx-mainline
yum -y install nginx

インストールした後は,

systemctl start nginx

でnginxを有効化します.

(当方の環境では直ちには有効化できず,

Problem 1: conflicting requests
- nothing provides module(perl:5.26) needed by module
perl-DBD-MySQL:4.046:8010020191114030811:073fa5fe-0.x86_64
Problem 2: conflicting requests
- nothing provides module(perl:5.26) needed by module
perl-DBI:1.641:8010020191113222731:16b3ab4d-0.x86_64

というエラーメッセージが出ましたが,インストールしていたperlバージョン5.26を

yum module enable perl:5.26

で適用することによって解決できたことを記録しておきます.)

nginxはデフォルトで/etc/nginx/conf.d内にある拡張子confのファイルをincludeで読み込んでいるかと思います.
そこで,/etc/nginx/conf.d/サイト名.confファイルを次のように作ります.(例ではhttps化しています.)

server {
listen 80;
server_name ドメイン名;
rewrite ^ https://$server_name$request_uri? permanent;
}

server {
listen 443 ssl;
server_name ドメイン名;
charset UTF-8;
access_log /var/log/nginx/ドメイン名_access.log main;
error_log /var/log/nginx/ドメイン名_error.log;
root /var/www/html/適当なパス;

ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
allow xxx.xxx.xxx.xxx;
deny all;
index index.html;
}

error_page 404 500 502 503 504 /error.html;

location ~ /\.ht {
deny all;
}

}

NginxはApacheとDeny, Allowの順が逆になるので注意してください.
ホワイトリストやブラックリストを作る場合には,allowdenyを列挙した部分を外部ファイルとし,include ファイルパスとする方が簡単です.

ファイルが用意できたら,

systemctl nginx restart

で再起動します.
Apacheで80ポートや443ポートを既に使っていたらエラーが出ますので,そちらをsystemctl disable httpdで停止するなどします.

FTP

SFTP専用ユーザーの作り方です.

まず,ユーザーの作成とグループの設定を行います.
ここではユーザー名をUSER,グループ名をsftponlyとしました.

groupadd sftponly
useradd USER
passwd USER
usermod -G sftponly USER

次に,/etc/ssh/sshd_configの末尾に次を追記します.
sftponlyグループのログインに関する設定で,このグループのユーザーがログインしたときに上の階層のディレクトリを隠すことを意図しています.

Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

さて,/home/USER以下ですが,これはrootのものであると定めます.
ただし,読み書き実行が可能としましょう.
実行可能にするのは,次に設置するディレクトリを開くなどの操作を可能とするためです.

usermod -d /home/USER USER
chown root:root /home/USER
chmod 755 /home/USER

ここで行ったことの狙いは,/home/USER/にはUSERがログインしたときに使われるファイルが存在するので,処分されないようにrootのものとしたことにあります.

USERが実際にファイルをアップロード/ダウンロードできるようにするには,rootでなくUSERが管理者であるようなフォルダを別途設置しなければなりません.
USERにディレクトリを作成し,その管理者をUSERにします.
ここでは,DIRという名前にしました.

mkdir /home/USER/DIR
chown USER:USER /home/USER/DIR

最後に,sshdを再起動して以上の設定を有効化します.

systemctl restart sshd

複数サイトで鍵認証を使い分ける

/home/USER_NAME/.ssh/configを作成し,次の形式で列挙します.

Host DOMAIN_NAME
Hostname xxx.xxx.xxx.xxx
port 22
User USER_NAME
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 60

ログインは

ssh DOMAIN_NAME

のみでよく,/home/USER_NAME/.ssh/configで記載した上からの順で認証が行われます.

参考文献

CentOS 7の基礎的な内容を網羅的に扱ったガイドブックです.

  • 大竹ら(2017)「標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド」,SBクリエイティブ.