2019年4月25日木曜日

CentOS 7 のインストールから sshd のセキュリティ設定まで



  • 目的
古い PC を再利用し、自宅用のサーバーを立てる。
(VPN や簡単なコーディングの学習用として)
  • 環境
Lenovo IdePad S10-3t
  Atom N450 1.66GHz
  メモリ 2 GB
  SSD 120 GB
 ※ Atom のため、消費電力、発熱も低いため、常時起動させる想定。
 (最大 30 W、アイドル時で 7.25 W)
  • CentOS のメディア作成

手元には Windows 機しかないため、公式よりダウンロードした
ISOファイル を Rufus で USB メモリにコピー。

https://rufus.ie/

  • CentOS 7 のインストール
USB メモリでブートし、CUI のみで使うため、minimal インストール。

日時と時刻:アジア/東京 タイムゾーン
キーボード:日本語
インストール先:swap 2 GB、/boot 1 GB、/ 残り全部

インストール時に WiFi へのアクセス情報を求められたため、
セキュリティキーを登録し、接続したことを確認。

しばらく待って、インストールは無事完了。


  • WiFi 接続

インストールが完了し、ログインするも IP アドレスが取得できていなかった。

yum list installed | grep Network

でパッケージを確認したところ、WiFi 接続に必要な NetworkManager-wifi がなかった。。

インストーラの USB から  NetworkManager-wifi をインストールするため、
USB メモリのマウントを行う。

parted コマンドで USB のファイルシステム、デバイス名を確認
(デバイス名は sdb、ファイルシステムは fat32)

# parted -l
~(中略)~
Model: SanDisk Ultra Fit (scsi)
Disk /dev/sdb: 124GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  124GB  124GB  primary  fat32        boot, lba


mount コマンドで /mnt にマウント(fat32 の場合は、vfat と指定する)
※ マウントするのは sdb の一番目のパーティションのため、sdb1 を指定する。
 sdb は raw デバイスを指すため、マウントできない。

# mount -t vfat /dev/sdb1 /mnt

マウントしたディレクトリを指定し、NetworkManager-wifi をインストールし、
ネットワークを再起動する。

# yum localinstall /mnt/Packages/NetworkManager-wifi-xxxxxx.rpm
# systemctl restart NetworkManager.service

インストール時に入力していたセキュリティキーは残っていたようで、
ネットワーク再起動後は、すぐに WiFi に接続している状態になった。

# nmcli dev wifi list
# nmcli dev wifi list
IN-USE  SSID                  MODE   CHAN  RATE        SIGNAL  BARS  SECURITY 
*           DUMMY-SSID          Infra  11    195 Mbit/s  70      ▂▄▆_   WPA2

ifcfg のファイルでも ONBOOT=yes となっており、再起動後もちゃんと WiFi 接続してくれた。

【参考】【Linux CentOS 7 64bit】WIFI接続の設定方法(コマンドラインで「nmcli」を使用する。)
http://akira-arets.blogspot.com/2016/11/linux-centos7-setting-wifi-connection.html


  • sshd の設定

デフォルトで sshd サービスは起動しているので、
まず初期作成したローカルユーザーでログインできることを確認。

パスワード認証を行わず、公開鍵認証に切り替え、
ポートもデフォルトの 23 から変更する。

Windows 10 の標準機能で ssh クライアントが使えるとのことなので、
これで ssh-keygen を行う。

【参考】Windows10標準のSSHクライアントを使ってみた
https://www.onebizlife.com/windows10-ssh-client-1980

Powershell を起動し、下記のコマンドを実行
(ed25519 は rsa、ecdsa よりも強力、安全なアルゴリズム)

PS C:\Users\hoge> ssh-keygen -t ed25519

パスフレーズを適宜入力すると、C:\Users\hoge\.ssh の下に
公開鍵(.pub)、秘密鍵、known_hosts が生成される。

ssh でログインする標準ユーザーで公開鍵を保管するディレクトリを作成する。
SFTP で ssh-keygen した公開鍵をコピーし、authorized_keys にリネーム


(既に authorized_keys がある場合は、中身を追記)

$ mkdir ~.ssh
$ chmod 700 .ssh/
$ mv id_ed25519.pub .ssh/authorized_keys ← 公開鍵は SFTP でコピーしておく。
$ chmod 600 .ssh/authorized_keys 

sshd の設定を変更する。
# vi /etc/ssh/sshd_config

#PubkeyAuthentication yes


 ↓
PubkeyAuthentication yes ← 公開鍵認証を許可する

#PermitRootLogin yes
 ↓
PermitRootLogin no ← root での ssh ログインを拒否する

設定変更後、systemctl restart sshd を行い、root でログインできないことと
秘密鍵でログインできるようになったことを確認する。

デフォルトのポートのままだと外部からの攻撃を受ける可能性が高くなるため、
ポート番号を任意のものに変える。

# vi /etc/ssh/sshd_config
Port xxxxx

上記設定を変えただけで、そのまま再起動しようとしても、成功しない。

# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.

journalctl -xe でログを見ると、ポートのバインドに失敗していることがわかる。

# journalctl -xe
(中略)
Apr 25 05:26:19 localhost.localdomain sshd[31772]: error: Bind to port xxxxx on 0.0.0.0 failed: Permission denied.
Apr 25 05:26:19 localhost.localdomain sshd[31772]: error: Bind to port xxxxx on :: failed: Permission denied.
Apr 25 05:26:19 localhost.localdomain sshd[31772]: fatal: Cannot bind any address.
Apr 25 05:26:19 localhost.localdomain systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a
Apr 25 05:26:19 localhost.localdomain systemd[1]: Failed to start OpenSSH server daemon.

先人の知恵によるとこれは SELinux の設定によるものということなので、
SELinux の設定を変更する。

SELinux の設定を変更するためのユーティリティがパッケージとなっているため、
下記コマンドでパッケージをインストールする。

# yum install policycoreutils-python

下記コマンドで sshd 用に使いたいポート番号を追加する。

# semanage port --add --type ssh_port_t --proto tcp xxxxx

続いて firewall の設定を変更する。
デフォルトの設定は /usr/lib/firewalld/services/ 以下にあるが、
編集する場合は、/etc/firewalld/services/ にコピーして対応する。

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

<?xml version="1.0" encoding="utf-8"?>
  <service>
    <short>SSH</short>
    <description>Secure Shell (SSH) is a protocol ...</description>
    <port protocol="tcp" port="22"/>
    <port protocol="tcp" port="xxxxx"/> ← 追加する
</service>

firewall ならびに sshd を再起動し、新しいポートで接続できることを確認する。

# firewall-cmd --reload
# systemctl restart sshd

デフォルトポート 22 番の閉塞

# vi /etc/firewalld/services/ssh.xml

<?xml version="1.0" encoding="utf-8"?>
  <service>
    <short>SSH</short>
    <description>Secure Shell (SSH) is a protocol ...</description>
    <port protocol="tcp" port="22"/> ← 削除する。
    <port protocol="tcp" port="xxxxx"/>
</service>

ファイアウォールを再起動して反映
# firewall-cmd --reload

※ SELinux の 22 番ポート解除について
下記コマンドで 22 番ポートの割り当てを解除しようとしたが、
事前定義されているためか、削除はエラーとなり、実行できなかった。

# semanage port --delete --type ssh_port_t --proto tcp 22
ValueError: Port tcp/22 is defined in policy, cannot be deleted

ただ、Firewall と sshd で 22 番ポートを使用しないようになっているため、
削除できないことによるリスクは全くない。

最後に sshd でパスワード認証を受け付けないように設定変更。
# vi /etc/ssh/sshd_config

PasswordAuthentication yes
 ↓
PasswordAuthentication no

systemctl restart sshd を行い、パスワード認証が通らないこと、
公開鍵認証が行えること、ポート 22 番での接続ができないことを確認する。

【参考】そこそこセキュアなlinuxサーバーを作る
https://qiita.com/cocuh/items/e7c305ccffb6841d109c

【参考】CentOS 7 で sshd のポート番号を変更する方法
https://weblabo.oscasierra.net/openssh-sshd-centos7-change-port/
※ こちらでは SELinux の 22 番ポートを外すことに成功しているようです。。。

0 件のコメント:

コメントを投稿

VPN サーバーの構築(SoftEther)

インターネット経由で自宅 LAN にアクセスできるように SoftEther で VPN サーバーを構築する。 ソフトウェアダウンロード https://www.softether-download.com/ja.aspx?product=softether インスト...