Centos8セットアップ(softetherセットアップ向け)

##はじめに

ここでは中級者向けにCentOS8のセットアップを解説します。
VPNのおすすめサーバーは以下のサイトが参考になります。[^1]
https://vpshikaku.com/

なお、この記事ではすべてrootで作業しているものとします。

環境は以下の通り

```shell
$ cat /etc/redhat-release 
CentOS Linux release 8.3.2011
```
## ホスト名の変更

初期設定のままだとわかりにくいので、以下のように変更する

```sh
root@vultr:~# hostnamectl set-hostname hoge
root@vultr:~# exit
```
一度、ログアウトし再度ログインすると、ホスト名が変更できているのが分かる

```sh
root@hoge:~# 
```

## タイムゾーンの設定
タイムゾーンをJSTに設定します。

```sh
$ timedatectl set-timezone Asia/Tokyo && \ timedatectl status

               Local time: 水 2021-01-13 13:09:18 JST
           Universal time: 水 2021-01-13 04:09:18 UTC
                 RTC time: 水 2021-01-13 04:09:18
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
## 各種ソフトウェアのインストール

```shell
$ dnf install -y epel-release && \
# EPELリポジトリの追加
dnf upgrade -y && \
dnf groupinstall -y "Development Tools" && \
dnf install -y kernel-devel kernel-headers && \
# 上2つのコマンドで各種ソフトウェアのビルドに必要なツールをインストールする。ubuntuのbuild-essentialsみたいなもの。
dnf install -y vim screen zlib-devel.x86_64 gcc.x86_64 zip unzip make wget tar bind-utils libevent-devel ncurses-devel traceroute && \
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && \
dnf upgrade -y && \
dnf install -y htop
```
dnfでこれらのソフトウェアをインストールする。
なお、私はVim派だ。
## tmuxの導入
tmuxとは、普段使っているシェルを拡張するソフトウェアだ。screenコマンドより高性能でモダンなため、今回用いることにする。
最小構成で構築したい場合、インストールしなくても問題ない。

```sh
wget https://github.com/tmux/tmux/releases/download/3.2/tmux-3.2.tar.gz
tar -zxvf tmux-3.2.tar.gz
cd tmux-3.2
./configure
make -j2
sudo make -j2 install
```


## Speedtest cliの導入
vpnを動作させたときにクライアントで理想の速度が出ない場合、サーバーの速度(スループット)が低下している場合がある。このような状態でサーバー側の回線速度を計測するのにこのツールを用いる。
個人的にはOoklaよりcloudflare.Speedtestの方が毎回正確な値が出るので重宝しているのだが、こっちは非公式ツールしかないのに注意したい。
このツールも最小構成で構築したい場合はインストールしなくても問題ない。

```sh
curl -sL https://rpm.nodesource.com/setup_14.x | bash - && \
yum install -y nodejs && \
npm update -g && \
echo "alias speedtest='npx speed-cloudflare-cli'" >> /root/.bashrc && \
npx speed-cloudflare-cli
```

## プロンプトの色を変更する
```shell
echo "export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '" >> /etc/profile.d/prompt.sh && \
echo "export PS1='\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\\$ '" >> /root/.bashrc
```
## システム全体の日本語化

```shell
$ dnf -y install langpacks-ja && \
localectl set-locale LANG=ja_JP.UTF-8 && \
source /etc/locale.conf
```
## firewallの導入、有効化
さくらVPSでもそうだが、ベンダー側がファイアウォールを用意している場合があるのでそれを使うのもあり。
私はサーバーサイドで有効化していないとfirewallがあることを忘れて詰むことがあるので設定する。

```sh
$ yum -y install firewalld && \
systemctl start firewalld && \
systemctl enable firewalld && \
systemctl is-enabled firewalld
enabled
# enabledなら全てうまくいっている。

# 後の設定のために一度ここでrebootしておく
reboot
```

## SELinuxの無効化
私はこれを使いこなせる技術がまだないので無効化しておく。
セキュリティー的に有効化したほうが好ましいので、興味のある方は[この記事](https://qiita.com/chi9rin/items/af532d0dd9237cc65741)を見てほしい。

```shell
$ vi /etc/selinux/config
SELINUX=permissive
```
```sh
# 後の設定のために一度ここでrebootしておく
$ reboot
```
##ssh用ユーザーの作成

```shell
# ssh用ユーザーの作成
$ useradd username

# 新規作成したユーザーでsudoの有効化
$ visudo

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

# whellにuserを追加
$ usermod -aG wheel username

#作成したユーザーでログイン
$ su username

# 所属グループを確認
$ groups

# sudoの確認
$ sudo passwd username
# Permission Deniedや許可がありませんと出た場合はwhellの追加のどこかでエラーが発生している。
```
ユーザーをグループに追加するときは-aではなく-aGを行う場合がほとんどだ。
-aは所属グループを書き換えてしまうが、-aGは追記してくれるので既存の所属グループに影響がない。
## vi → vim の alias を追加する

```shell
echo "alias vi='vim'" >> /root/.bashrc
source ~/.bashrc
```
##公開鍵認証でSSHする
今どきパスワード認証のサーバーを運用するのは怖いので、公開鍵認証を用いてsshする。
[この記事](https://gigazine.net/news/20200828-ssh-encryption-algorithm/)いわく、EdDSAが一番いいらしいのでこれを用いる。[^2]

```sh
#クライアント側ssh用ユーザーで作業する
$ cd
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/hogehoge/.ssh/id_ed25519): 
#どこに鍵を置くかと聞いている、そのままEnter
Created directory '/home/sk002/.ssh'.
Enter passphrase (empty for no passphrase): 
#鍵にパスフレーズを設定するか聞いている、鍵だけで十分なのでそのままEnter
Enter same passphrase again: 
#パスフレーズの再入力、そのままEnter
Your identification has been saved in /home/hogehoge/.ssh/id_ed25519.
Your public key has been saved in /home/hogehoge/.ssh/id_ed25519.pub.
The key fingerprint is:
#鍵情報とか
The key's randomart image is:
#鍵情報とか
```
鍵情報が生成されていることを確認

```sh
$ ls .ssh/id_ed25519*
.ssh/id_ed25519  .ssh/id_ed25519.pub
```
鍵情報の名前を変更

```sh
cat .ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
```
鍵情報のパーミッション変更

```sh
$ chmod 0700 ~/.ssh/ && \
chmod 0600 ~/.ssh/authorized_keys
```

sshdの再起動

```sh
$ systemctl restart sshd
```
scpやSFTPなどを用いて公開鍵をサーバーに飛ばす。
私はChromeのSecure Shellという拡張機能を用いてSFTPを行い、鯖側で生成した認証情報をローカルに持ってくる。
この拡張機能を使うのならば、普段のSSH時の"接続"ボタンの隣にSFTPのボタンがあるので試してほしい。
この拡張機能のSFTPではファイルのダウンロードが get filename.hogeでアップロードはputとコマンドを打つだけでいい。
https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd

```sh:クライアント側コンソール
$ scp authorized_keys 
scp username@exsample.net:/home/user/.ssh/id_ed25519 .
```
サーバー側のsshd_configの変更


```sh:sshd_config
PubkeyAuthentication yes　# 公開鍵認証を有効化

PasswordAuthentication no　# パスワード認証を無効化
```

`$ systemctl restart sshd`で設定を反映した後、
接続テスト、-iオプションで鍵を指定

```sh
$ ssh -i id_ed25519 username@exsample.net
```

すでにサーバーにログインしている場合にcatなどで鍵情報を表示させてそれでログインするのはおすすめしない。
秘密鍵ファイルの改行情報が失われる場合などで、正常にログインできない。
catでもvimでもうまくいかない場合が多い。

##SSHポート変更
これはSELinuxとfirewallの設定後でないとサーバーにsshできなくなって詰むことがあるので注意したい。
先にファイアウォールを開けておく

###firewall設定変更
```sh
# 既存のssh用のfirewallルールファイルをコピーする
$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-22222.xml

# ssh-22222.xmlを編集
$ vim /etc/firewalld/services/ssh-22222.xml
```

以下の内容に変更

```sh:ssh-22222.xml
<port protocol="tcp" port="22222"/>
```

```sh
#reloadでランタイムルールに設定を反映
$ firewall-cmd --reload

#パーマネントルールにssh-22222を反映
$ firewall-cmd --permanent --add-service=ssh-22222

パーマネントルールにある既存のsshを削除
$ firewall-cmd --permanent --remove-service=ssh

#reloadでランタイムルールにパーマネントルールの設定を反映
$ firewall-cmd --reload

#設定内容一覧表示
$ firewall-cmd --list-all
```
###sshd_configの変更

```sh
$ vim /etc/ssh/sshd_config

# 追加するPort番号は何でもいい
- # Port 22
+ Port 22222

# sshでのパスワード認証を無効化する。
# 事前に公開鍵認証を有効化しておく必要がある。
PasswordAuthentication no

# rootでのログインを禁止する
PermitRootLogin no

$ systemctl restart sshd
```

SELinuxを有効にしている場合は以下で変更できる。
[SELinux有効化時のSSHポート変更](https://qiita.com/honahuku/items/89124cbf2a90ac70cb41)

##おわり
お疲れ様です。softetherのセットアップは以下の通りです。
https://qiita.com/honahuku/items/1fdc8c6b6ad49816f1a0

## 参考文献
firewallのインストール
https://qiita.com/ponsuke0531/items/b90a837fc1e839d905c3
firewall-cmd
https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab
SELinuxの無効化
https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba
SSHの公開鍵認証の種類について1
https://gigazine.net/news/20200828-ssh-encryption-algorithm/
SSHの公開鍵認証の種類について2
https://qiita.com/wnoguchi/items/a72a042bb8159c35d056
EdDSA(ed25519)について
https://qiita.com/angel_p_57/items/a1dc4e9c0b18a23c5242
ユーザー追加
https://qiita.com/araish/items/b6a408e09f34e0845db1
ユーザーのsudo有効化
https://qiita.com/Esfahan/items/a159753d156d23baf180
ssh公開鍵認証の有効化
https://eng-entrance.com/linux-ssh-key

[^1]: 私はWebarena indigoとさくらVPSを利用している。
[^2]: 一般的に使われているのはRSA 2048bitかRSA 4096bitだ。セキュリティー的にECDSA 256bitが良いと最近まで思っていたのだが、EdDSA(ed25519)というものがあるのでこれを使っている。詳しくは[ここ](https://qiita.com/angel_p_57/items/a1dc4e9c0b18a23c5242)参照。