Linux
CentOS

【CentOS7】Linuxインストール後にする最低限のセキュリティ

More than 1 year has passed since last update.

CentOS7からiptablesじゃなくてfirewalldだったりnetstatがなくなっちゃったりサービス管理がsystemdになったりといろいろアレがヤバくてウケるので、覚え書き程度に書いていきます。

まずは最強のセキュリティ対策

# yum update

これは定期的にしましょうネ

sshでのrootログインを無効にする

Linuxにおいて神であるrootでログインできるのは色々とマズいのでsshだと一般ユーザでログインするようにしましょう

パンピーを作成

# useradd -mG wheel hoge
# passwd hoge
ここで任意のパスワードを2回入力

※素直にhogeとかいうユーザをつくってしまう可愛い子もいるがhogeは任意の文字列という意味なので適宜読み替えつつ好きなユーザ名にしましょう。

rootログインを無効に

# vim /etc/ssh/sshd_config

yesをnoに書き換える

- PermitRootLogin yes
+ PermitRootLogin no

sshdを再起動

# systemctl restart sshd

公開鍵認証方式に変える

鍵を作ろう(これはクライアント側で!)

この項目はたった今設定していたCentOSではなく、SSHログインに使いたいマシン上で行いましょう。

Windowsの人はPuttyとかTeraTermなんかで鍵が作れます。
MacだったりLinuxの人は以下のコマンドで作成しましょう

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): Enterキーを押す
Created directory '/home/hoge/.ssh'. 
Enter passphrase (empty for no passphrase):  任意のパスワードを入力する
Enter same passphrase again:  もう一度任意のパスワードを入力する
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
この辺になんかRamdomArtが出てプロンプトが戻ってくるので、exitでRootに戻りましょう。

鍵の種類はRSAです。巨大な2つの素数をかけ合わせた数の素因数分解が難しいことを安全性の根拠としています。
サマーウォーズにも出てきたアレですネ。

約40年前に考案された方式ですが、今日まで安全に使えています。
本当にこれが安全なのか確かめたい人は鼻血を出しながら2056桁の暗号を手計算してみると面白いと思います。

公開鍵をクライアント側に転送する

sshクライアントソフトなどで作ったssh公開鍵(id_rsa.pub)を転送します。
僕はとりあえずTeratermにしました。

ssh接続する

CentOSマシンで以下のコマンドを打ってipアドレスを調べましょう

# ifconfig

出てきたipアドレスをメモしてTeratermでssh接続しましょう(最初に作った一般ユーザで!)

ログインに成功したらTeratermの画面に先程作ったid_rsa.pubをドラッグアンドドロップします。
SCPをクリックするとすぐ転送が終わると思います。
ここから先は基本的にTeraterm(もしくはその他のSSHクライアント)で作業を続けていきます。

権限の設定を変える

Teratermの画面に戻り、lsを入力するとログインしたユーザのホームディレクトリに
id_rsa.pubが入っているのがわかると思います。
こいつの居場所を作ってあげた上で権限を適切に設定します。

$ cd
$ mkdir .ssh
$ chmod 700 .ssh
$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

公開鍵認証を有効に

# vim /etc/ssh/sshd_config

行頭の#を削除してアンコメントする

- #PubKeyAuthentication yes
+ PubKeyAuthentication yes

yesをnoに書き換える

- #PasswordAuthentication yes
+ PasswordAuthentication no

sshdの再起動

# systemctl restart sshd

exitでssh接続を終了し、
再度Teratermを開き作成した秘密鍵(id_rsa)を使って接続ができるかを確認する。
また、パスワード認証でログインが失敗することも確認しておく。

sshのポート番号を変更しよう

デフォルトの22番ポートを開けっ放しにしておくと頻繁にアタックされて非常にヤベーので、ポートを変えましょう

今使っているポートを調べる

# yum install lsof
# lsof -i -nP

右端に出てきます。ここで使ってない番号ならOK

configを書き換える

# vim /etc/ssh/sshd_config
- #Port 22
+ Port 10022

別に10022でなくても、1024番以降かつlsofで調べた中で使ってない番号ならOK
覚えやすい番号がいいので10022とか20022とかにしとくといいと思います。

sshdの再起動

# systemctl restart sshd

…でいいと思ったんだけど

Job for sshd.service failed because the control process exited with error code.

とか言われてしまったので、原因を探っていきましょう

# systemctl status sshd

なんかerror: Bind to port 10022 on 0.0.0.0 failedとかPermission Deniedとか言われてしまったので多分SELinuxってメンヘラの仕業だと思います。
じゃあペペっと変更していきましょう!

# semanage port -a -t ssh_port_t -p tcp 10022

ところがcommand not found: semanageと言われてしまったのでインストールします。
semanageはpolicycoreutils-pythonに含まれているので、

# yum install policycoreutils-python

でインストールします。

# semanage port -a -t ssh_port_t -p tcp 10022

これで変更できました!

firewalldの設定

# systemctl status firewalld

でActive(running)になっていることを確認したら、ちょこちょこ設定していきましょう

sshサービスの設定を変更 17/05/31編集

使えるサービス一覧にsshがあるかどうか探します。

# firewall-cmd --get-services | grep ssh

環境にもよりますが、Teratermでは赤色で強調表示されました。

次に、sshのxmlファイルをコピーして22を10022に書き換えます。
ズボラなのでsedを使ってますが、別の部分も置き換えられてしまう可能性のあるファイルを編集するときはvimで書きかえてあげたらいいと思います。

# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml

# sed -i 's/22/10022/g' /etc/firewalld/services/ssh.xml

# firewall-cmd --reload

### 10022ポートでssh接続できるように設定(やらなくてよい)
コメントにて教えていただきました。
この方法は後々の管理の観点から見てもあまりよろしくないので、できるよってことだけ覚えて、実際の利用では
"sshサービスの設定を変更 17/05/31編集"の項を利用してください。
新しく開けた10022ポートはこのままだとファイアーウォールに弾かれて使えないので、
firewalld君に頼んで開けてもらいます。

# firewall-cmd --permanent --add-port=10022/tcp
# firewall-cmd --reload

開けてしまったポートを閉じる方法(やらなくてよい)

# firewall-cmd --permanent --remove-port=10022/tcp
# firewall-cmd --reload

publicの確認

こんな感じになってると思います。
sshが許可サービスに入っていることがわかりますね。

$ firewall-cmd --list-all --zone=public --permanent               
[/home/hoge]
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

sshdの再起動

# systemctl restart sshd
# systemctl status sshd

これでActive(runnning)となっていればひとまず安心です。
ちゃんと指定したポートで接続できるか確認しておきましょう

もうちょいセキュアに

必要な部分以外を全部無効にします。

# vim /etc/ssh/sshd_config
- #Protocol 2
+ Protocol 2

- #RSAAuthentication no
+ RSAAuthentication no

- #PermitEmptyPasswords no
+ PermitEmptyPasswords no

- #ChallengeResponseAuthentication no
+ ChallengeResponseAuthentication no

- #KerberosAuthentication no
+ KerberosAuthentication no

- #GSSAPIAuthentication no
+ GSSAPIAuthentication no

- #X11Forwarding no
+ X11Forwarding no

+ AllowUsers hoge

X11Forwardingは、X window systemを使うならyesでもOK

設定が終わったらsshdを再起動しましょう

# systemctl restart sshd

VPSとかじゃなくて自宅鯖の場合

実際にはこれだけ設定してもマシンにキーボード直接繋いでちょちょっと起動オプションいじるだけで
rootログインされてしまいます。
学校とか家とかにサーバーを置いてる人は上だけでもやっておくとちょっと違うのでやっておきましょう。

起動オプション変更時にパスワードを要求する

# grub2-setpassword

これでSingleUserModeでのログインにパスワードを要求することができます。
このパスワードを忘れると非常にガチでマズいので絶対忘れないように!

さらにログインするときにもパスワードを要求したい場合(やらなくてよい)

※これをやるとsshでの再起動後マシンが自動で立ち上がらないので注意!

# vim /boot/grub2/grub.cfg

menuentryで始まる行を探し、--unrestrictedという文字列をすべて削除する

他には(やらなくてよい)

BIOSにパスワードをかけたりするのもいいと思います。
やりかたはメーカーによって違うかな~と思うのでググってください。
これもsshで再起動後マシンが立ち上がらないので注意です。

たぶんこれで

最低限のセキュリティ対策はできたかな~と思います。
そのうちApacheとかnginxなんかでWebサーバを建てたときのセキュリティ対策も書いていきます…
暇があれば…

これはダメだろとかこれやったほうがいいよとかここ分かりづらいとかあったら教えて下さい。

どうでもいいけど

この記事書くのにQiitaの会社が作ってるKobito使ったんだけどメチャいいっスね…

mac版Kobitoはvimキーバインドが使えないから別のエディタ使ってるけど、
軽量だしファイルの保存場所とか考えず雑にかけるので、WindowsでMarkdownの記事を書くならオススメだと思います。

参考文献

CentOS 7 firewalld よく使うコマンド