2019年5月20日月曜日

VPN サーバーの構築(SoftEther)

インターネット経由で自宅 LAN にアクセスできるように
SoftEther で VPN サーバーを構築する。

ソフトウェアダウンロード
https://www.softether-download.com/ja.aspx?product=softether

インストール方法は下記公式サイトを参照

9.3 Linux へのインストールと初期設定
https://ja.softether.org/4-docs/1-manual/9/9.3

必要なソフトウェア、ライブラリを確認したところ、
gcc が必要と判明したため、gcc のパッケージを追加でインストール
# yum install gcc

pthread ライブラリのパッケージがインストールされていることを
確認できなかったが、glibc に含まれているとのことだった。

【不明点】Linux(RHEL7.4)にpthread ライブラリがなくても大丈夫でしょうか?
https://www.vpnusers.com/viewtopic.php?p=84605&sid=2e81576cfd35ce9413211e7a962ff4f5


インストール後の初期設定は Windows からだと GUI で行えるようなので、
Windows にインストールした管理ツールから VPN サーバーに接続できるよう
TCP ポートの 443 を開放する。(VPN サーバーは CUI での運用)

7.4 初期設定
https://ja.softether.org/4-docs/1-manual/7/7.4

また、VPN 接続用のポート UDP 500、4500 も同時に開放する。
(L2TP over IPsec、EtherIP over IPsec を使用する場合)

VPN サービス用の Firewall 設定ファイルを追加する。
# vi /etc/firewalld/services/vpnserver.xml

<?xml version="1.0" encoding="utf-8"?>
  <service>
    <short>VPN</short>
    <description>SoftEther VPN</description>
    <port protocol="tcp" port="443"/>
    <port protocol="udp" port="500"/>
    <port protocol="udp" port="4500"/>
</service>

設定ファイルを読み込ませる
# firewall-cmd --reload

XML ファイルに記載したサービス名を指定して、常時ポート開放するように設定する
# firewall-cmd --permanent --zone=public --add-service=vpnserver

設定を有効化する
# firewall-cmd --reload

これでファイアウォールが開放され、Windows の管理ツールから接続できた。

VPN サーバーの初期設定

IP アドレス、ポート番号 443 を指定して、接続
初回接続時は VPN サーバーの管理者パスワードの設定を求められる。



リモートアクセス VPN サーバーにチェックを入れ、OK


「はい」をクリック

仮想 HUB 名を設定
ethernet.net が提供する DDNS への登録
ここで登録されるホスト名でインターネット経由 でアクセスすることが可能になる

iPhone などからもアクセスできるよう L2TP over IPSec にチェック

VPN Azure クラウドは今回使用しないため、無効にする。

最後にルータ側で UDP 500, 4500 を VPN サーバーにフォワードする設定を行い、
インターネット経由で VPN 接続できるようになったことを確認した。

なお、ファイアウォールと SELinux については以下の記載があったのだが、
いずれも有効なままでインストールを完了することができた。

https://ja.softether.org/4-docs/1-manual/7/7.3
ファイアウォール機能や SELinux 機能などは、無効の状態でインストールを完了させてください。これらの機能は、VPN Server が正しくインストールできたことを確認してから必要な場合のみ有効にしてください。

2019年5月9日木曜日

No-IP(DDNS) にグローバル IP を自動登録する設定

インターネット経由で自宅サーバーにアクセスするため、
DDNS(No-IP) にグローバル IP を登録する。

クライアントツールと手順は No-IP のサイトを参照。

Dynamic DNS Update Client for Linux
https://www.noip.com/download?page=linux

How to Install the Dynamic Update Client on Linux
https://www.noip.com/support/knowledgebase/installing-the-linux-dynamic-update-client/

クライアントツールのインストール
# cd /usr/local/src
# wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
# tar xzf noip-duc-linux.tar.gz
# cd no-ip-2.1.9
# make
# make install

設定ファイルの作成
# /usr/local/bin/noip2 -C
--------------------------------
Auto configuration for Linux client of no-ip.com.

Please enter the login/email string for no-ip.com  email@example.com
Please enter the password for user 'email@example.com'  ********

Only one host [example.com] is registered to this account.
It will be used.
Please enter an update interval:[30]
Do you wish to run something at successful update?[N] (y/N)

New configuration file '/usr/local/etc/no-ip2.conf' created.
--------------------------------

クライアントツールの起動
# /usr/local/bin/noip2

と、これで動作はするのだが、サービスとして OS に登録されていないため、
systemd のユニットファイルを作成する。

# vi /etc/systemd/system/noip2.service
--------------------------------
[Unit]
Description=No-IP update daemon
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/noip2
Restart=always
Type=forking

[Install]
WantedBy=multi-user.target
--------------------------------

自動起動 ON
# systemctl enable noip2

サービス起動
# systemctl start noip2

Systemdを使ってさくっと自作コマンドをサービス化してみる

ユニットファイルを作成する際にはまったのが、以下のエラー。
------------------------------------------------------
# systemctl status noip2
● noip2.service - No-IP update daemon
   Loaded: loaded (/etc/systemd/system/noip2.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Fri 2019-04-26 07:40:58 JST; 2min 10s ago
  Process: 3404 ExecStart=/usr/local/bin/noip2 (code=exited, status=0/SUCCESS)
 Main PID: 3404 (code=exited, status=0/SUCCESS)

Apr 26 07:40:57 localhost.localdomain systemd[1]: Started No-IP update daemon.
Apr 26 07:40:57 localhost.localdomain noip2[3407]: v2.1.9 daemon started with NAT enabled
Apr 26 07:40:57 localhost.localdomain noip2[3407]: Can't gethostbyname for dynupdate.no-ip.com
Apr 26 07:40:57 localhost.localdomain noip2[3407]: Can't get our visible IP address from ip1.dynupdate.no-ip.com
------------------------------------------------------

ネットワーク接続後に noip2 サービスを起動するよう
ユニットファイルで依存関係、起動順序を定義することで解消できた。

Wants=network-online.target
After=network-online.target

以下のサイトが参考になりました。

systemdで確実にネットワークの起動後にサービスを起動させたい場合のメモ
https://kernhack.hatenablog.com/entry/2014/09/20/110938
https://qiita.com/yunano/items/8636a6dd6becad84920d

と、グローバル IP が更新されても、DDNS のレコードは自動更新されるのですが、
No-IP で登録したホスト名の方は有効期限が 30 日となっており、
期限が切れる前に Web での更新が必要みたいなので、別の DDNS の方が幸せかもしれません。

No-IP がダウンしたときも考えて、もう1つくらい DDNS に登録しようかな。
No-IP の Web 画面を操作するこんなスクリプトもあるようですが、未検証。。

Script to auto renew/confirm noip.com free hosts
https://github.com/loblab/noip-renew


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 番ポートを外すことに成功しているようです。。。

VPN サーバーの構築(SoftEther)

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