- 目的
古い 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 のインストール
日時と時刻:アジア/東京 タイムゾーン
キーボード:日本語
インストール先: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)
~(中略)~
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 でログインする標準ユーザーで公開鍵を保管するディレクトリを作成する。
これで 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 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 でログを見ると、ポートのバインドに失敗していることがわかる。
(中略)
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="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 no
systemctl restart sshd を行い、パスワード認証が通らないこと、
公開鍵認証が行えること、ポート 22 番での接続ができないことを確認する。
【参考】そこそこセキュアなlinuxサーバーを作る
【参考】CentOS 7 で sshd のポート番号を変更する方法
https://weblabo.oscasierra.net/openssh-sshd-centos7-change-port/
※ こちらでは SELinux の 22 番ポートを外すことに成功しているようです。。。