2021年11月27日土曜日

OpenLDAP入門② (OpenLDAPでLDAPSを有効化する)

前回、RHEL 7にOpenLDAPをインストールして、OpenLDAPサーバを構築する手順を記載した。しかし、LDAPは通信が暗号化されておらず、認証情報が平文でネットワークに流れてしまう。そこで、LDAPをSSLで暗号化するLDAPS (LDAP over SSL) を使い通信の暗号化を行うことで、セキュリティ強化を図る。

本記事では、OpenLDAPサーバに設定追加を行いLDAPSにて通信できるように構成するための手順を記載する。

環境

RHEL 7にてOpenLDAPサーバを構築済みの環境から、LDAPSを有効にする手順を記載する。OpenLDAPサーバの構築手順は前回記事を参照いただきたい。

  • OS : Red Hat Enterprise Linux 7.7
  • OpenLDAP : 2.4.44

OpenLDAPのドメイン等の情報は以下とする。

設定項目 設定値
ドメイン dc=example,dc=com
RootDN cn=Manager,dc=example,dc=com
OU ou=group,dc=example,dc=com
グループ cn=ldapgrp,ou=group,dc=example,dc=com
ユーザ1 uid=user01,ou=group,dc=example,dc=com
ユーザ2 uid=user01,ou=group,dc=example,dc=com

OpenLDAPのLDAPS有効化手順

1. LDAPS用のサーバ証明書を作成

LDAPSはLDAP over SSLの略である通り、SSLサーバ証明書の作成が必要となる。OpenLDAPのサーバ証明書は/etc/openldap/certs/に配置する。

まず、SSLサーバ証明書に必要となるSAN (Subject Alternative Name) を設定するためのファイルを作成する。今回は、以下の通り作成した。

# cd /etc/openldap/certs/
# cat << EOF > san.txt
subjectAltName = DNS:*.example.com, IP:192.168.11.117
EOF

サーバ証明書は、以下コマンドで作成する。

# openssl genrsa 2048 > ldaps.key
# openssl req -new -key ldaps.key > ldaps.csr
# openssl x509 -days 3650 -req -signkey ldaps.key -in ldaps.csr -out ldaps.crt -extfile san.txt

実際のコマンド実行結果は以下の通り。CSR作成時に証明書作成に必要な情報を対話式で入力する。

# openssl genrsa 2048 > ldaps.key
Generating RSA private key, 2048 bit long modulus
..............................................................+++
..................+++
e is 65537 (0x10001)

# openssl req -new -key ldaps.key > ldaps.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP ←★JPを入力
State or Province Name (full name) []:Tokyo ←★任意の都市名を入力
Locality Name (eg, city) [Default City]: ←★そのままEnter
Organization Name (eg, company) [Default Company Ltd]: ←★そのままEnter
Organizational Unit Name (eg, section) []: ←★そのままEnter
Common Name (eg, your name or your server's hostname) []:LDAPS ←★任意の名称を入力。今回はLDAPSと入力
Email Address []: ←★そのままEnter

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←★そのままEnter
An optional company name []: ←★そのままEnter

# openssl x509 -days 3650 -req -signkey ldaps.key -in ldaps.csr -out ldaps.crt -extfile san.txt
Signature ok
subject=/C=JP/ST=Tokyo/L=Default City/O=Default Company Ltd/CN=LDAPS
Getting Private key

2. LDAPS有効化に必要な設定を追加

OpenLDAPサーバの設定ファイルに以下の通りLDAPSに必要となる設定を追加する。

# cp /etc/sysconfig/slapd{,.org}
# vi /etc/sysconfig/slapd
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///" ←★「ldaps:///」を追加

次にssl.ldifというLDIFファイルを作成し、LDAPS用の証明書及び秘密鍵となるファイルの指定を行う。このLDIFファイルをldapaddコマンドにて設定追加する。

# cd ~
# cat << EOF > ssl.ldif
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldaps.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldaps.key
EOF

# ldapadd -Y EXTERNAL -H ldapi:// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

3. OpenLDAPを再起動

ここまで設定したら、OpenLDAPを再起動し、LDAPSの636ポートが開放されることを確認する。

# systemctl restart slapd

# ss -nl | egrep '389|636'
tcp    LISTEN     0      128       *:636                   *:*
tcp    LISTEN     0      128       *:389                   *:*
tcp    LISTEN     0      128    [::]:636                [::]:*
tcp    LISTEN     0      128    [::]:389                [::]:*

4. LDP.exeを使った確認

LDAPSはそのままではLDP.exeにて接続することができず、OpenLDAPサーバにて作成したSSLサーバ証明書の公開鍵であるldaps.crtを「信頼されたルート証明機関」として登録が
必要
となる。

/etc/openldap/certs/ldaps.crtLDP.exeを実行するサーバにダウンロードし、ファイルをダブルクリックすると証明書の情報を確認することができ、「証明書のインストール」を選択することで「証明書のインポートウィザード」を開始できる。

インポートウィザードでは証明書ストアにて「信頼されたルート証明機関」を選択する。

セキュリティ警告が表示される場合があるが、自己署名証明書による証明書エラーとなることから、そのまま「はい」を選択する。

証明書をインポートしたのち、再度LDP.exeにて接続すると、以下の通りSSLによる接続に成功する。

以上でOpenLDAPでLDAPSを有効化する手順は完了となる。次回は、LinuxのSSSDを使って本サーバに対して認証連携を行うことにする。

2021年11月23日火曜日

VyOSで冗長化したDHCPサーバを構築する

VyOSはDHCPサーバ機能を備えており、さらに2台のVyOSでDHCPサーバの機能を冗長化することができる。今回は、VyOSを使った冗長化されたDHCPサーバの構築手順を以下に記載する。

環境

VyOSのバージョンによって設定コマンドが若干異なるため、以下2つのバージョンを使用して手順確認を行った。

VyOS 1.4.x

  • VyOS#1 (Primary) : 1.4-rolling-202111220318
  • VyOS#2 (Secondary) : 1.4-rolling-202111220318

VyOS 1.3.x

  • VyOS#1 (Primary) : 1.3-rolling-202012311144
  • VyOS#2 (Secondary) : 1.3-rolling-202012311144

192.168.11.0/24のネットワークに対し、192.168.11.201-240のレンジからIPアドレスのリースを行うよう設定する。また、static-mappingの設定にて、特定のMACアドレスを持つクライアントのIPアドレスを固定する。

DHCPサーバ構築手順 (1.4.x)

1. VyOS#1側設定 (Primary)

設定に必要なコマンドを以下にコメントを付けて記載する。

# VyOS#2をremote、VyOS#1をsource-addressとしてIPアドレスを設定
set service dhcp-server failover name dhcp1
set service dhcp-server failover remote 192.168.11.32
set service dhcp-server failover source-address 192.168.11.33

# VyOS#1をPrimaryに設定
set service dhcp-server failover status primary

# DHCPで配布するデフォルトゲートウェイとDNS
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 default-router '192.168.11.31'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 name-server '192.168.11.61'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 name-server '192.168.11.62'

# DHCPリース時間を86400秒 (24時間) に設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 lease '86400'

# DHCPリースを行うIPアドレスの開始・終了を指定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 start '192.168.11.201'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 stop '192.168.11.240'

# 対象のサブネットをフェイルオーバー対象に設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 enable-failover

# IPアドレス固定設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> ip-address '192.168.11.15'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> mac-address 'aa:bb:cc:11:22:33'

設定投入後、commitsaveをしておく。

# commit
# save

2. VyOS#2側設定 (Secondary)

設定に必要なコマンドを以下にコメントを付けて記載する。設定内容はIPアドレスやPrimary/Secondaryの設定を除けば、VyOS#1側と同様となる。

# VyOS#1をremote、VyOS#2をsource-addressとしてIPアドレスを設定
set service dhcp-server failover name dhcp1
set service dhcp-server failover remote 192.168.11.33
set service dhcp-server failover source-address 192.168.11.32

# VyOS#2をSecondaryに設定
set service dhcp-server failover status secondary

# DHCPで配布するデフォルトゲートウェイとDNS
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 default-router '192.168.11.31'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 name-server 192.168.11.61
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 name-server 192.168.11.62

# DHCPリース時間を86400秒 (24時間) に設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 lease '86400'

# DHCPリースを行うIPアドレスの開始・終了を指定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 start '192.168.11.201'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 stop '192.168.11.240'

# 対象のサブネットをフェイルオーバー対象に設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 enable-failover

# IPアドレス固定設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> ip-address '192.168.11.15'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> mac-address 'aa:bb:cc:11:22:33'

設定投入後、commitsaveをしておく。

# commit
# save

DHCPサーバ構築手順 (1.3.x)

1. VyOS#1側設定 (Primary)

設定に必要なコマンドを以下にコメントを付けて記載する。

# DHCPで配布するデフォルトゲートウェイとDNS
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 default-router '192.168.11.31'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 dns-server '192.168.11.61'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 dns-server '192.168.11.62'

# VyOS#1をlocal、VyOS#2をpeerとしてIPアドレスを設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover local-address '192.168.11.33'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover peer-address '192.168.11.32'

# フェイルオーバーグループ名とステータスをPrimaryに設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover name 'dhcp1'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover status 'primary'

# DHCPリース時間を86400秒 (24時間) に設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 lease '86400'

# DHCPリースを行うIPアドレスの開始・終了を指定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 start '192.168.11.201'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 stop '192.168.11.240'

# IPアドレス固定設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> ip-address '192.168.11.15'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> mac-address 'aa:bb:cc:11:22:33'

設定投入後、commitsaveをしておく。

# commit
# save

2. VyOS#2側設定 (Secondary)

設定に必要なコマンドを以下にコメントを付けて記載する。設定内容はIPアドレスやPrimary/Secondaryの設定を除けば、VyOS#1側と同様となる。

# DHCPで配布するデフォルトゲートウェイとDNS
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 default-router '192.168.11.31'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 dns-server '192.168.11.61'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 dns-server '192.168.11.62'

# VyOS#1をlocal、VyOS#2をpeerとしてIPアドレスを設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover local-address '192.168.11.32'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover peer-address '192.168.11.33'

# フェイルオーバーグループ名とステータスをSecondaryに設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover name 'dhcp1'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 failover status 'secondary'

# DHCPリース時間を86400秒 (24時間) に設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 lease '86400'

# DHCPリースを行うIPアドレスの開始・終了を指定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 start '192.168.11.201'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 range 0 stop '192.168.11.240'

# IPアドレス固定設定
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> ip-address '192.168.11.15'
set service dhcp-server shared-network-name dhcp_scope_01 subnet 192.168.11.0/24 static-mapping <任意の文字列> mac-address 'aa:bb:cc:11:22:33'

設定投入後、commitsaveをしておく。

# commit
# save

DHCPの動作確認

実際にWindows等を同じネットワークに接続させて、DHCPにてIPアドレスを取得できることを確認してみる。

VyOSのDHCPサーバにてリースしたIPアドレスの一覧は、show dhcp server leasesで確認できる。冗長化しているため、VyOS#1、#2の両方で同一結果が出力されるはずだ。

VyOS#1側

$ show dhcp server leases
IP address      Hardware address    State    Lease start          Lease expiration     Remaining    Pool           Hostname
--------------  ------------------  -------  -------------------  -------------------  -----------  -------------  ----------------
192.168.11.223  00:0c:29:31:7a:11   active   2021/01/03 07:26:51  2021/01/03 07:56:51  0:29:37      dhcp-scope-01
192.168.11.224  00:0c:29:31:7a:1b   active   2021/01/03 07:26:51  2021/01/03 07:56:51  0:29:37      dhcp-scope-01
192.168.33.202  3c:6a:a7:92:95:3c   active   2021/01/01 22:53:23  2021/01/02 22:22:06               dhcp-scope-02  DESKTOP-9I8V9NC
192.168.33.204  fc:f5:c4:95:22:ee   active   2021/01/02 20:51:48  2021/01/03 20:51:48  13:24:34     dhcp-scope-02

VyOS#2側

$ show dhcp server leases
IP address      Hardware address    State    Lease start          Lease expiration     Remaining    Pool           Hostname
--------------  ------------------  -------  -------------------  -------------------  -----------  -------------  ----------------
192.168.11.223  00:0c:29:31:7a:11   active   2021/01/03 07:26:51  2021/01/03 07:56:51  0:29:53      dhcp_scope_01
192.168.11.224  00:0c:29:31:7a:1b   active   2021/01/03 07:26:51  2021/01/03 07:56:51  0:29:53      dhcp_scope_01
192.168.33.202  3c:6a:a7:92:95:3c   active   2021/01/01 22:53:23  2021/01/02 22:22:06               dhcp-scope-02  DESKTOP-9I8V9NC
192.168.33.204  fc:f5:c4:95:22:ee   active   2021/01/02 20:51:48  2021/01/03 20:51:48  13:24:50     dhcp_scope_02

参考

更新履歴

  • 2021/11/23 VyOS 1.4.xの設定手順を追加
2021年11月20日土曜日

OpenLDAP入門① (OpenLDAP初期構築手順)

Red Hat Enterprise Linux 7 (RHEL7) で利用できるOpenLDAPは、ユーザやパスワード情報を一元管理し、認証機能を提供することができる。ただし、Red Hat Enterprise Linux 8 (RHEL8) になってから、OpenLDAPは非サポートとなり、代わりに「Red Hat Directory Server (RHDS)」が利用できるようになった。

なお、RHEL 8でもしOpenLDAPを利用したい要件がある場合の選択肢としては、OSSTech製のOpenLDAPを利用するという方法もある。

そのような状況ではあるが、本記事では純粋な「RHEL 7のOpenLDAP」を使ってLDAPサーバを構築する手順を記載する。内容が多いため、以下の3回に分けて記載する。

環境

前述した通り、今回はRHEL 7のOpenLDAPを構築する。

  • OS : Red Hat Enterprise Linux 7.7
  • OpenLDAP : 2.4.44

OpenLDAPのドメイン等の情報は以下とする。

設定項目 設定値
ドメイン dc=example,dc=com
RootDN cn=Manager,dc=example,dc=com
OU ou=group,dc=example,dc=com
グループ cn=ldapgrp,ou=group,dc=example,dc=com
ユーザ1 uid=user01,ou=group,dc=example,dc=com
ユーザ2 uid=user01,ou=group,dc=example,dc=com

OpenLDAPサーバ構築手順

1. OpenLDAPパッケージのインストール

OpenLDAPを使うためには、yumを使用してopenldap-serversopenldap-clientsをインストールするだけでよい。

# yum install openldap-servers openldap-clients -y

~(中略)~

インストール:
  openldap-clients.x86_64 0:2.4.44-21.el7_6
  openldap-servers.x86_64 0:2.4.44-21.el7_6

完了しました!

特に依存関係もないため、rpmを使って直接インストールすることも可能。RHEL 7のインストールメディアからインストールする場合は、以下の通り実行する。

# rpm -ivh openldap-servers-2.4.44-21.el7_6.x86_64.rpm
# rpm -ivh openldap-clients-2.4.44-21.el7_6.x86_64.rpm

2. OpenLDAPの起動

インストールをしたら、とりあえずOpenLDAPを起動させる。

# systemctl start slapd
# systemctl enable slapd

3. 管理用パスワードの設定

いよいよOpenLDAPの設定を実施していく。まず、設定ファイルをディレクトリ丸ごとバックアップしておこう。

# cp -pr /etc/openldap/slapd.d{,_20211016}
# ls -ld /etc/openldap/slapd.d*
drwxr-x---. 3 ldap ldap 45  7月 18 14:49 /etc/openldap/slapd.d
drwxr-x---. 3 ldap ldap 45  7月 18 14:49 /etc/openldap/slapd.d_20210718

OpenLDAPはldapaddldapmodifyldapdeleteコマンドを使用して設定する。これらのコマンドに「LDIF」と呼ばれるLDAP用の設定情報が記載されたファイルを読み込ませることで、直接設定ファイルを編集しなくとも設定することができる

今回はldapaddコマンドにて設定を行う。構文は以下と覚えておく。

ldapadd -Y EXTERNAL -H ldapi:/// -f [ファイル名].ldif

-Y EXTERNAL : root作業時のパスワード入力をスキップ
-H ldapi:/// : ローカルのLDAPに対する作業

まずOpenLDAPに必要となる管理用パスワードを設定する。パスワードは平文ではなくハッシュ値にてLDIFファイルに記載する。パスワードのハッシュ値を生成するためのコマンドとして、slappasswdが用意されているため、こちらを利用してパスワードのハッシュ値を生成する。

生成されたパスワードはソルト付きのSHA-1のハッシュ値となり、{SSHA}という文字が先頭に付いた32文字となる。

# slappasswd
New password:
Re-enter new password:
{SSHA}XXX~(省略)~XXX

以下の通りLDIFファイルを作成して、ldapaddコマンドにて設定する。

# cat << EOF > rootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=config
-
add: olcRootPW
olcRootPW: {SSHA}XXX~(省略)~XXX
EOF

# ldapadd -Y EXTERNAL -H ldapi:/// -f rootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

設定内容を確認するコマンドとしてはldapsearchを使う。指定するオプションは以下の通り。

オプション 説明
-LLL LDIF バージョンを表示させないため、Lオプションを3つ付与する。
-b LDAPの検索位置を指定する。

実際に確認した結果は以下の通りとなる。

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'olcDatabase={0}config,cn=config'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth" manage by * none
olcRootDN: cn=config
olcRootPW: {SSHA}XXX~(省略)~XXX

4. 管理者パスワードの設定

管理者パスワードとして、monitorとhdbのパスワードを設定する。monitorはモニターデータベース、hdbはLDAPのデータベース本体と理解しておこう。

今回、それぞれの管理ユーザは「cn=Manager,dc=example,dc=com」で設定する。この管理ユーザをRootDNと呼ぶ。

以下の通りLDIFファイルを作成して、ldapaddコマンドにて設定する。

# cat << EOF > hdbpw.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
-
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com
-
add: olcRootPW
olcRootPW: {SSHA}XXX~(省略)~XXX
EOF

# ldapadd -Y EXTERNAL -H ldapi:/// -f hdbpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

5. スキーマの追加

LDAPで利用するスキーマを設定する。スキーマは、cosine.ldifinetorgperson.ldifnis.ldifを登録すればLDAPサーバとして利用できる。

登録コマンドは以下の通り。

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif

実際の実行結果は以下の通り。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

6. BaseDN、OU、グループを登録

ここまで設定すれば、LDAPサーバにBaseDNや、OU、グループが登録できる。

設定項目 設定値
ドメイン dc=example,dc=com
OU ou=group,dc=example,dc=com
グループ cn=ldapgrp,ou=group,dc=example,dc=com

以下の通りLDIFファイルを作成する。

# cat << EOF > base.ldif
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

dn: ou=group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

dn: cn=ldapgrp,ou=group,dc=example,dc=com
objectClass: posixGroup
gidNumber: 10000
cn: ldapgrp
EOF

ここからはldapaddコマンドを利用することは変わらないが、少しオプションが異なり、先ほど設定した管理者 (cn=Manager,dc=example,dc=com) を指定して登録を行う点に注意する。

# ldapadd -x -D "cn=Manager,dc=example,dc=com" -w '[RootDNのパスワード]' -f base.ldif
adding new entry "dc=example,dc=com"

adding new entry "ou=group,dc=example,dc=com"

adding new entry "cn=ldapgrp,ou=group,dc=example,dc=com"

7. ユーザを登録

ユーザを登録する。

設定項目 設定値
ユーザ1 uid=user01,ou=group,dc=example,dc=com
ユーザ2 uid=user01,ou=group,dc=example,dc=com

以下の通りLDIFファイルを作成して、ldapaddコマンドにて設定する。

# cat << EOF > user.ldif
dn: uid=user01,ou=group,dc=example,dc=com
uid: user01
cn: Hoge Hoge
sn: user01
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword: {SSHA}XXX~(省略)~XXX
loginShell: /bin/bash
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/user01

dn: uid=user02,ou=group,dc=example,dc=com
uid: user02
cn: Hoge Hoge
sn: user02
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword: {SSHA}XXX~(省略)~XXX
loginShell: /bin/bash
uidNumber: 10002
gidNumber: 10000
homeDirectory: /home/user02
EOF

# ldapadd -x -D "cn=Manager,dc=example,dc=com" -w '[RootDNのパスワード]' -f user.ldif
adding new entry "uid=user01,ou=group,dc=example,dc=com"

adding new entry "uid=user02,ou=group,dc=example,dc=com"

これで一通り設定が完了したので、最後にldapsearchコマンドで登録結果を確認してみよう。

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'ou=group,dc=example,dc=com'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: ou=group,dc=example,dc=com ←★OU「group」の情報
objectClass: organizationalUnit
ou: Group

dn: cn=ldapgrp,ou=group,dc=example,dc=com ←★グループ「ldapgrp」の情報
objectClass: posixGroup
gidNumber: 10000
cn: ldapgrp

dn: uid=user01,ou=group,dc=example,dc=com ←★ユーザ「user01」の情報
uid: user01
cn: Hoge Hoge
sn: user01
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword:: e1NTSEF9TFdVQXZyNzUvQlBpUDJ2MWZ5amxFdDlEVlB0d0lVYmU=
loginShell: /bin/bash
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/user01

dn: uid=user02,ou=group,dc=example,dc=com ←★ユーザ「user02」の情報
uid: user02
cn: Hoge Hoge
sn: user02
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword:: e1NTSEF9TFdVQXZyNzUvQlBpUDJ2MWZ5amxFdDlEVlB0d0lVYmU=
loginShell: /bin/bash
uidNumber: 10002
gidNumber: 10000
homeDirectory: /home/user02

8. LDP.exeを使った確認

ここまでの設定を行ったことで、OpenLDAPサーバに対してLDAPによる接続が可能となる。

実際に、外部からアクセスできることをWindows ServerのLDP.exeを利用して確認する。なお、LDP.exeは、役割管理ツールの「AD DSおよびAD LDSツール」に含まれる。

「ファイル名を指定して実行」にてldpを入力し「OK」を押すと、LDP.exeが起動する。

「ファイル」→「接続」を選択し、OpenLDAPサーバのIPアドレスとポート番号「389」を指定する。また、今回はLDAPSを使用しないため、SSLのチェックを外しておく。

次に、「表示」→「ツリー」を選択し、「ou=group,dc=example,dc=com」を入力する。

以下の通りOUに登録されているグループとユーザが表示されれば、問題なくOpenLDAPの設定は完了となる。

なお、バインドせずともOpenLDAPサーバに登録されているグループとユーザが表示される理由は、LDAPのデータベースに対してアクセス権を設定していない場合は、デフォルトで匿名ユーザの参照権限が有効となるためである。権限の設定方法は、別記事で紹介することとし、今回は割愛する。

以上で、OpenLDAPサーバの構築は完了となる。次回以降は今回構築したOpenLDAPサーバに対して、LDAPSの有効化やLinuxのSSSDを使って認証連携を行うことにする。

参考

2021年11月17日水曜日

AlmaLinuxをESXiにインストールしてみた

Red Hat Enterprise Linux (RHEL) のダウンストリーム版のディストリビューションであるCentOS 8は2021年末でサポートが終了し、以降はRHELのアップストリーム版であるCentOS Streamのみがサポートされることが発表された。

当初、CentOS 8は2029年までサポートされる予定であったが、突然サポート期間が短縮されてしまったことにより、CentOS 8を利用しているユーザは、早急にCentOS StreamやRHELへの移行を検討する必要が生じている

そんな中、今までのCentOSと同様の位置付けのRHELダウンストリーム版のディストリビューションの開発がいくつかのプロジェクトで進められており、「AlmaLinux」もそのディストリビューションの1つである。

AlmaLinuxは2021/3/30にバージョン8.3が正式リリースされたので、実際にAlmaLinuxをESXi上の仮想マシンとしてインストールしてみた

環境

  • ESXi : 6.7 Update 3
  • OS : AlmaLinux 8.3

AlmaLinuxインストール手順

1. AlmaLinuxのISOイメージをダウンロード

AlmaLinuxのISOイメージは、以下URLからダウンロードできる。

RHEL 8やCentOS 8と同様に、DVDのISOイメージ (AlmaLinux-8.3-x86_64-dvd.iso) は8.6GBもあるため、容量が大きすぎて困る場合は、minimal (AlmaLinux-8.3-x86_64-minimal.iso) をダウンロードし、必要なパッケージは別途インストールしても問題ない。

今回は、minimalをダウンロードしてインストールを行う。

2. ESXiにて仮想マシンを作成

ESXiの仮想マシンは以下設定にて作成する。

  • ゲストOSのファミリ : Linux
  • ゲストOSのバージョン : その他の Linux 4.x 以降 (64 ビット)
  • [仮想マシンのオプション] → [UEFIセキュアブートの有効化] : チェックを外す

CentOS 8と異なり「UEFIセキュアブートの有効化」のチェックが有効のままではインストールが開始できないので、必ずチェックを外すこと。
※【注意】AlmaLinux 8.4以降はSecure Bootに対応したため本手順は不要。

もし、チェックをしたままだと「EFI VMware Virtual SATA CDROM Drive (0.0)… unsuccessful.」のメッセージが表示され、ISOイメージからの起動ができない。なお、OSインストール後に有効に戻してもAlmaLinuxは起動できないことを確認している。

3. RHELやCentOSと同様にインストール

ISOイメージからブートしてしまえば、RHELやCentOSでおなじみのインストールウィザードが開始される。最低限、言語設定、時刻と日付 (タイムゾーン)、rootパスワード、インストール先を設定し、インストールを開始する。

4. インストール後、ログイン

インストール後、仮想コンソールを使ってrootでログインし、nmtuiなどを使ってネットワークの設定を行う。

なお、redhat-releaseを確認したところ、以下の通り「AlmaLinux 8.3」となっていることが確認できた。

# cat /etc/redhat-release
AlmaLinux release 8.3 (Purple Manul)

5. open-vm-toolsをインストール

ネットワークの設定を行いインターネットに接続できるようになったら、dnfにてopen-vm-toolsをインストールする。

# dnf install open-vm-tools -y
最速のミラーを確定しています (70 hosts).. done. ---  B/s |   0  B     --:-- ETA
AlmaLinux 8 - BaseOS                            3.4 MB/s | 3.4 MB     00:01
AlmaLinux 8 - AppStream                          12 MB/s | 6.8 MB     00:00
AlmaLinux 8 - PowerTools                         13 MB/s | 2.1 MB     00:00
AlmaLinux 8 - Extras                             65 kB/s | 3.6 kB     00:00
依存関係が解決しました。
================================================================================
 パッケージ           Arch        バージョン               リポジトリー   サイズ
================================================================================
インストール:
 open-vm-tools        x86_64      11.1.0-2.el8             appstream      715 k
依存関係のインストール:
 fuse                 x86_64      2.9.7-12.el8             baseos          82 k
 fuse-common          x86_64      3.2.1-12.el8             baseos          21 k
 libdrm               x86_64      2.4.101-1.el8            appstream      164 k
 libmspack            x86_64      0.7-0.3.alpha.el8.4      appstream       71 k
 libpciaccess         x86_64      0.14-1.el8               baseos          32 k
 libtool-ltdl         x86_64      2.4.6-25.el8             baseos          58 k
 libxslt              x86_64      1.1.32-5.el8             baseos         249 k
 pciutils             x86_64      3.6.4-2.el8              baseos         102 k
 tar                  x86_64      2:1.30-5.el8             baseos         837 k
 xmlsec1              x86_64      1.2.25-4.el8             appstream      190 k
 xmlsec1-openssl      x86_64      1.2.25-4.el8             appstream       93 k

トランザクションの概要
================================================================================
インストール  12 パッケージ

ダウンロードサイズの合計: 2.6 M
インストール済みのサイズ: 7.6 M
パッケージのダウンロード:
done.inux 8 - BaseOS     [            ===     ] ---  B/s |   0  B     --:-- ETA
(1/12): fuse-common-3.2.1-12.el8.x86_64.rpm     1.2 MB/s |  21 kB     00:00
(2/12): libpciaccess-0.14-1.el8.x86_64.rpm      1.2 MB/s |  32 kB     00:00
(3/12): fuse-2.9.7-12.el8.x86_64.rpm            2.5 MB/s |  82 kB     00:00
(4/12): libtool-ltdl-2.4.6-25.el8.x86_64.rpm    3.1 MB/s |  58 kB     00:00
(5/12): pciutils-3.6.4-2.el8.x86_64.rpm         5.5 MB/s | 102 kB     00:00
(6/12): libxslt-1.1.32-5.el8.x86_64.rpm         7.8 MB/s | 249 kB     00:00
(7/12): libdrm-2.4.101-1.el8.x86_64.rpm         4.0 MB/s | 164 kB     00:00
(8/12): tar-1.30-5.el8.x86_64.rpm                11 MB/s | 837 kB     00:00
(9/12): libmspack-0.7-0.3.alpha.el8.4.x86_64.rp 1.2 MB/s |  71 kB     00:00
(10/12): xmlsec1-1.2.25-4.el8.x86_64.rpm        9.9 MB/s | 190 kB     00:00
(11/12): xmlsec1-openssl-1.2.25-4.el8.x86_64.rp 2.9 MB/s |  93 kB     00:00
(12/12): open-vm-tools-11.1.0-2.el8.x86_64.rpm  8.2 MB/s | 715 kB     00:00
--------------------------------------------------------------------------------
合計                                            9.4 MB/s | 2.6 MB     00:00

~(中略)~

インストール済み:
  fuse-2.9.7-12.el8.x86_64            fuse-common-3.2.1-12.el8.x86_64
  libdrm-2.4.101-1.el8.x86_64         libmspack-0.7-0.3.alpha.el8.4.x86_64
  libpciaccess-0.14-1.el8.x86_64      libtool-ltdl-2.4.6-25.el8.x86_64
  libxslt-1.1.32-5.el8.x86_64         open-vm-tools-11.1.0-2.el8.x86_64
  pciutils-3.6.4-2.el8.x86_64         tar-2:1.30-5.el8.x86_64
  xmlsec1-1.2.25-4.el8.x86_64         xmlsec1-openssl-1.2.25-4.el8.x86_64

完了しました!

open-vm-toolsがインストールされると、ESXiでもホスト名やIPアドレスを認識するようになる。

以上でAlmaLinuxのインストールが完了となる。

更新履歴

  • 2021/11/17 AlmaLinux 8.4 GA版のリリースに伴い内容を更新 (Secure Bootにサポートした旨追記)

Rocky LinuxをESXiにインストールしてみた

Red Hat Enterprise Linux (RHEL) のダウンストリーム版のディストリビューションであるCentOS 8は2021年末でサポートが終了し、以降はRHELのアップストリーム版であるCentOS Streamのみがサポートされることが発表された。

当初、CentOS 8は2029年までサポートされる予定であったが、突然サポート期間が短縮されてしまったことにより、CentOS 8を利用しているユーザは、早急にCentOS StreamやRHELへの移行を検討する必要が生じている

そんな中、今までのCentOSと同様の位置付けのRHELダウンストリーム版のディストリビューションの開発がいくつかのプロジェクトで進められており、「Rocky Linux」もそのディストリビューションの1つである。

Rocky Linuxは2021/4/30にバージョン8.3 RC版がリリースされ、2021/6/4にバージョン8.4 RC版、そしてついに2021/6/21にバージョン8.4 GA版がリリースされた。本記事では、実際にRocky LinuxをESXi上の仮想マシンとしてインストールしてみた

環境

  • ESXi : 6.7 Update 3
  • OS : Rocky Linux 8.4

Rocky Linuxインストール手順

1. Rocky LinuxのISOイメージをダウンロード

Rocky LinuxのISOイメージは、以下URLからダウンロードできる。

RHEL 8やCentOS 8と同様に、DVDのISOイメージ (Rocky-8.X-x86_64-dvd1.iso) は8.6GBもあるため、容量が大きすぎて困る場合は、minimal (Rocky-8.X-x86_64-minimal.iso) をダウンロードし、必要なパッケージは別途インストールしても問題ない。

今回は、minimalをダウンロードしてインストールを行う。

2. ESXiにて仮想マシンを作成

ESXiの仮想マシンは以下設定にて作成する。

  • ゲストOSのファミリ : Linux
  • ゲストOSのバージョン : その他の Linux 4.x 以降 (64 ビット)
  • [仮想マシンのオプション] → [UEFIセキュアブートの有効化] : チェックを外す

CentOS 8と異なり「UEFIセキュアブートの有効化」のチェックが有効のままではインストールが開始できないので、必ずチェックを外すこと。
※【注意】Rocky Linux 8.5以降はSecure Bootに対応したため本手順は不要。

もし、チェックをしたままだと「EFI VMware Virtual SATA CDROM Drive (0.0)… unsuccessful.」のメッセージが表示され、ISOイメージからの起動ができない。なお、OSインストール後に有効に戻してもRocky Linuxは起動できないことを確認している。

3. RHELやCentOSと同様にインストール

ISOイメージからブートしてしまえば、RHELやCentOSでおなじみのインストールウィザードが開始される。最低限、言語設定、時刻と日付 (タイムゾーン)、rootパスワード、インストール先を設定し、インストールを開始する。なお、Rocky Linuxでは「ソフトウェアの選択」がデフォルトでは「サーバー」になっている。少しでも不要なパッケージをインストールしたくない場合は、「最小限のインストール」に変更すること。

4. インストール後、ログイン

インストール後、仮想コンソールを使ってrootでログインし、nmtuiなどを使ってネットワークの設定を行う。

なお、redhat-releaseを確認したところ、以下の通り「Rocky Linux 8.4」となっていることが確認できた。

# cat /etc/redhat-release
Rocky Linux release 8.4 (Green Obsidian)

5. open-vm-toolsをインストール

ネットワークの設定を行いインターネットに接続できるようになったら、dnfにてopen-vm-toolsをインストールする。

# dnf install open-vm-tools -y
Rocky Linux 8 - AppStream                       3.7 MB/s | 6.7 MB     00:01
Rocky Linux 8 - BaseOS                          5.5 MB/s | 2.5 MB     00:00
Rocky Linux 8 - Extras                          2.8 kB/s | 1.6 kB     00:00
依存関係が解決しました。
================================================================================
 パッケージ           Arch        バージョン               リポジトリー   サイズ
================================================================================
インストール:
 open-vm-tools        x86_64      11.1.0-2.el8             appstream      716 k
依存関係のインストール:
 fuse                 x86_64      2.9.7-12.el8             baseos          81 k
 fuse-common          x86_64      3.2.1-12.el8             baseos          20 k
 libdrm               x86_64      2.4.101-1.el8            appstream      164 k
 libmspack            x86_64      0.7-0.3.alpha.el8.4      appstream       69 k
 libpciaccess         x86_64      0.14-1.el8               baseos          31 k
 libtool-ltdl         x86_64      2.4.6-25.el8             baseos          57 k
 libxslt              x86_64      1.1.32-5.el8             baseos         248 k
 pciutils             x86_64      3.6.4-2.el8              baseos         101 k
 tar                  x86_64      2:1.30-5.el8             baseos         837 k
 xmlsec1              x86_64      1.2.25-4.el8             appstream      191 k
 xmlsec1-openssl      x86_64      1.2.25-4.el8             appstream       94 k

トランザクションの概要
================================================================================
インストール  12 パッケージ

ダウンロードサイズの合計: 2.5 M
インストール済みのサイズ: 7.6 M
パッケージのダウンロード:
(1/12): libmspack-0.7-0.3.alpha.el8.4.x86_64.rp  22 MB/s |  69 kB     00:00
(2/12): xmlsec1-1.2.25-4.el8.x86_64.rpm          66 MB/s | 191 kB     00:00
(3/12): xmlsec1-openssl-1.2.25-4.el8.x86_64.rpm  46 MB/s |  94 kB     00:00
(4/12): fuse-2.9.7-12.el8.x86_64.rpm             79 MB/s |  81 kB     00:00
(5/12): open-vm-tools-11.1.0-2.el8.x86_64.rpm    65 MB/s | 716 kB     00:00
(6/12): fuse-common-3.2.1-12.el8.x86_64.rpm      19 MB/s |  20 kB     00:00
(7/12): libpciaccess-0.14-1.el8.x86_64.rpm       31 MB/s |  31 kB     00:00
(8/12): libtool-ltdl-2.4.6-25.el8.x86_64.rpm     55 MB/s |  57 kB     00:00
(9/12): libxslt-1.1.32-5.el8.x86_64.rpm         144 MB/s | 248 kB     00:00
(10/12): libdrm-2.4.101-1.el8.x86_64.rpm         11 MB/s | 164 kB     00:00
(11/12): pciutils-3.6.4-2.el8.x86_64.rpm        9.9 MB/s | 101 kB     00:00
(12/12): tar-1.30-5.el8.x86_64.rpm               21 MB/s | 837 kB     00:00
--------------------------------------------------------------------------------
合計                                            7.2 MB/s | 2.5 MB     00:00

~(中略)~

インストール済み:
  fuse-2.9.7-12.el8.x86_64            fuse-common-3.2.1-12.el8.x86_64
  libdrm-2.4.101-1.el8.x86_64         libmspack-0.7-0.3.alpha.el8.4.x86_64
  libpciaccess-0.14-1.el8.x86_64      libtool-ltdl-2.4.6-25.el8.x86_64
  libxslt-1.1.32-5.el8.x86_64         open-vm-tools-11.1.0-2.el8.x86_64
  pciutils-3.6.4-2.el8.x86_64         tar-2:1.30-5.el8.x86_64
  xmlsec1-1.2.25-4.el8.x86_64         xmlsec1-openssl-1.2.25-4.el8.x86_64

完了しました!

open-vm-toolsがインストールされると、ESXiでもホスト名やIPアドレスを認識するようになる。

以上でRocky Linuxのインストールが完了となる。

更新履歴

  • 2021/05/06 新規作成
  • 2021/06/05 Rocky Linux 8.4 RC版のリリースに伴い内容を更新
  • 2021/06/22 Rocky Linux 8.4 GA版のリリースに伴い内容を更新 
  • 2021/11/17 Rocky Linux 8.5 GA版のリリースに伴い内容を更新 (Secure Bootにサポートした旨追記)

2021年11月13日土曜日

WireGuardを使ってスマホから自宅にVPN接続する

先日、WireGuardサーバをLinux上で構築し、Windows用のWireGuardクライアントを用いてVPN接続を行う手順を記事にした。

WindowsのPCから接続できるだけでなく、スマホからもVPNで接続できると自宅のNASのデータなどにアクセスできて便利であることから、今回は、Android用のWireGuardクライアントを使ってインターネット越しに自宅にVPN接続する手順を記載する。

環境

WireGuardサーバの構築手順は前回の記事を参照いただきたい。

  • スマホOS : Android 11
  • WireGuardサーバOS : AlmaLinux 8.3

Android用WireGuardクライアント設定手順

1. WireGuardクライアントのインストール

Google Playストアより「wireguard」で検索を行い、「WireGuard」をインストールする。

2. WireGuardのconfファイル作成

Windows用のWireGuardクライアントと同一の設定ファイルを作成し、スマホに保存しておく。今回は以下の通り作成した。

[Interface]

設定値 設定内容
Address WireGuardクライアントで使用するIPアドレスを指定。
PrivateKey wgclient.keyの内容を指定。

[Peer]

設定値 設定内容
PublicKey wgserver.pubの内容を指定。
AllowedIPs 対向先の接続機器と通信をさせるIPアドレスを記載する。通常はWireGuardサーバのIPアドレスと自宅のプライベートアドレスを指定すればよい。もしすべての通信をWireGuardのVPN経由とさせる場合は、0.0.0.0/0を指定する。
Endpoint 自宅のグローバルIPまたはDDNS名などを設定している場合はFQDNを用いて[IP or FQDN]:[ポート番号]の形式で接続先のWireGuardサーバを指定する。

今回は以下のように設定ファイルを作成した。

[Interface]
PrivateKey = [wgclient.keyの内容を指定]
Address = 10.0.33.11/32

[Peer]
PublicKey = [wgserver.pubの内容を指定]
AllowedIPs = 10.0.33.1/32, 192.168.0.0/16
Endpoint = [自宅のグローバルIP or FQDN]:[ポート番号]

3. 設定ファイルのインポート

青色の「+」ボタンを選択すると、設定方法の選択肢が表示される。

「IMPORT FROM FILE OR ARCHIVE」を選択する。

先ほど作成した設定ファイル (私の環境ではwgclient.conf) を選択する。

インポートに成功すると、以下の通りVPN接続用の設定が追加される。

4. 接続確認

先ほど追加されたVPN設定のボタンを押し有効化する。特に問題なければすぐに接続状態になり、Androidの上部ステータスバーに鍵マークが表示される。

実際に自宅のQNAPのNASのファイル閲覧をしてみたところ、問題なくインターネット越しにファイル閲覧をすることができた。

以上で、Android用のWireGuardクライアントを使ってインターネット越しに自宅にVPN接続する手順は完了となる。

2021年11月8日月曜日

WireGuardを使って自宅にVPN接続する方法

自宅環境ではインターネット経由でVPN接続をできるように、QNAP NASのQVPN Serviceの機能を利用してOpenVPNサーバを構築している。OpenVPNによる接続手順は以下記事にて記載している。

最近はWireGuardと呼ばれる比較的新しいOSSのVPNソフトウェアが存在する。ソースコードが4,000行程度と非常にコンパクトで、Linuxのカーネルモジュールとして動作するという特徴がある。

QNAP NASの最新OSであるQTS 5.0.0でもWireGuardによるVPN接続がサポートされたとのことだが、残念ながらx86のCPUのみ利用可能となっており、私のQNAP TS-231Pでは対応していなかった。

そこで、今回はWireGuardをLinux上に構築し、Windows用のWireGuardクライアントからインターネット越しに自宅にVPN接続する手順を記載する。

環境

今回はRHELクローンであるAlmaLinuxにて構築を行ったが、CentOSや本家RHELでも同様の手順で構築できるだろう。なお、8.xと9.xのOSにおいて一部手順に差異がある。

  • OS : AlmaLinux 8.3、AlmaLinux 9.2

なお、スマホからもWireGuardでVPN接続は可能であり、設定方法は別記事「WireGuardを使ってスマホから自宅にVPN接続する」を参照いただきたい。

WireGuard構築手順 (Linux)

1. パッケージのインストール

今回はRed Hat系LinuxにおけるWireGuardの構築手順となる。その他のディストリビューションにおける構築手順は、以下公式サイトの内容を確認いただきたい。

WireGuardは、RHEL 8.xはEPELのリポジトリに用意されており、RHEL 9は通常のリポジトリ存在する。したがって、dnfyumを用いてパッケージによるインストールが可能となる。注意点として、RHEL 8.xの場合は、一度OSを再起動しなければ以降の手順でエラーとなるため注意すること(RHEL 9.xの場合は再起動は不要)。

★RHEL 8.xの場合
# dnf install elrepo-release epel-release -y
# dnf install kmod-wireguard wireguard-tools -y
# reboot
★RHEL 9.xの場合
# dnf install wireguard-tools -y

以下に、RHEL 8.xのパッケージインストール後にリブートしなかった場合のエラー情報を参考までに記載する。WireGaurd用のインタフェースを作成しようとしても、以下の通りError: Unknown device typeにてエラーとなる。

# ip link add dev wg0 type wireguard
Error: Unknown device type.
# modprobe wireguard
modprobe: FATAL: Module wireguard not found in directory /lib/modules/4.18.0-240.el8.x86_64

2. サーバ用の秘密鍵と公開鍵を作成

WireGuardは、サーバもクライアントも必ず秘密鍵と公開鍵のペアを設定する必要がある。wgコマンドにて鍵作成をすることができるたため、以下の通りサーバとクライアント用の鍵を作成する。

ファイル名 説明
wgserver.key サーバ用秘密鍵
wgserver.pub サーバ用公開鍵
wgclient.key クライアント用秘密鍵
wgclient.pub クライアント用公開鍵
# cd /etc/wireguard
# wg genkey > wgserver.key
# wg pubkey < wgserver.key > wgserver.pub
# wg genkey > wgclient.key
# wg pubkey < wgclient.key > wgclient.pub

# chmod 600 wgserver.key
# chmod 600 wgclient.key
# ls -l wg*
-rw------- 1 root root  45 10月 30 19:52 wgclient.key
-rw-r--r-- 1 root root  45 10月 30 19:52 wgclient.pub
-rw------- 1 root root  45 10月 27 06:46 wgserver.key
-rw-r--r-- 1 root root  45 10月 27 06:46 wgserver.pub

3. ポートフォワードの設定

WireGuardはVPN用途としてインタフェースとIPアドレスが作成される。このインタフェースとLinuxサーバの本来の通信を行うインタフェース間で通信をできるようにする必要があるため、以下の通りポートフォワードを有効にする。

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1

4. WireGuardのconfファイル作成

WireGuardの設定はwgコマンドによる設定もできるが、今回はwg0.confというファイル名で設定ファイルを作成し、wg-quickコマンドを用いて読み込ませることで設定反映を行う。

設定ファイルの内容は以下の通りとなる。[Interface]は自分側の設定となり、[Peer]は対向側の設定となる。

[Interface]

設定値 設定内容
Address WireGuardで使用するIPアドレスを指定。
MTU 接続時のMTUを記載。デフォルトでは1420が設定されるが、環境によってはリモートデスクトップ接続がうまく動作しない (黒い画面が表示され接続・切断を繰り返す) ため1400や1380に設定する。私の環境では1380に設定すると問題なく動作するようになった。
PrivateKey wgserver.keyの内容を指定。
ListenPort WireGuardが使用するポート番号を指定。デフォルトは51820。
PostUp WireGuard起動時に実行するコマンドを指定。WireGuardで使用するIPアドレスはセグメントが異なることから、そのままでは通信ができないため、iptablesを用いてNATを有効にする。
PostDown WireGuard停止時に実行するコマンドを指定。

[Peer]

設定値 設定内容
PublicKey wgclient.pubの内容を指定。
AllowedIPs 対向先の接続機器と通信をさせるIPアドレスを記載する。通常はクライアントに割り当てるIPアドレスを指定すればよい。

設定ファイルは、以下のように新規作成する。

# cat << EOF > /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.33.1/32
MTU = 1380
PrivateKey = [wgserver.keyの内容を指定]
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE

[Peer]
PublicKey = [wgclient.pubの内容を指定]
AllowedIPs = 10.0.33.11/32
EOF

5. WireGuard起動確認

設定ファイルを作成後、一度手動でWireGuardを起動させる。コマンドはwg-quick upコマンドを使用する。

# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.33.1/32 dev wg0
[#] ip link set mtu 1400 up dev wg0
[#] ip -4 route add 10.0.33.11/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE

WireGuardを停止する際は、wg-quick downコマンドを使用する。

# wg-quick down wg0
[#] ip link delete dev wg0
[#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE

6. systemctlにて自動起動設定

先ほどの起動・停止が問題なくできることを確認したら、systemctlにてWireGuardを自動起動するよう設定する。

# systemctl start wg-quick@wg0
# systemctl enable wg-quick@wg0
# systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
   Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; enabled; vendor p>
   Active: active (exited) since Sat 2021-10-30 15:42:05 JST; 2s ago
     Docs: man:wg-quick(8)
           man:wg(8)
           https://www.wireguard.com/
           https://www.wireguard.com/quickstart/
           https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
           https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
  Process: 8128 ExecStop=/usr/bin/wg-quick down wg0 (code=exited, status=0/SUCC>
  Process: 8156 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCE>
 Main PID: 8156 (code=exited, status=0/SUCCESS)

10月 30 15:42:05 t3036vpns systemd[1]: Starting WireGuard via wg-quick(8) for w>
10月 30 15:42:05 t3036vpns wg-quick[8156]: [#] ip link add wg0 type wireguard
10月 30 15:42:05 t3036vpns wg-quick[8156]: [#] wg setconf wg0 /dev/fd/63
10月 30 15:42:05 t3036vpns wg-quick[8156]: [#] ip -4 address add 10.0.33.1/32 d>
10月 30 15:42:05 t3036vpns wg-quick[8156]: [#] ip link set mtu 1400 up dev wg0
10月 30 15:42:05 t3036vpns wg-quick[8156]: [#] ip -4 route add 10.0.33.11/32 de>
10月 30 15:42:05 t3036vpns wg-quick[8156]: [#] iptables -A FORWARD -i wg0 -j AC>
10月 30 15:42:05 t3036vpns systemd[1]: Started WireGuard via wg-quick(8) for wg

ブロードバンドルータの設定

WireGuardはUDPの58120ポートを使うため、ブロードバンドルータでポート開放を行う必要がある。設定方法は各社のルーターのマニュアルを確認すること。通常は「ポートマッピング」といった呼ばれ方の設定項目があるはずで、外部からの特定ポートのアクセスをLAN側の特定のサーバに転送する設定を行えばよい。

以下NECのAtermでの設定例を記載する。

  • LAN側ホスト:WireGuardサーバのIPアドレスを設定
  • プロトコル : UDP
  • 変換対象ポート番号:任意で指定
  • 宛先ポート番号:58120

WireGuard接続手順 (Windows)

1. WireGuardクライアントのインストール

Windows用のWireGuardクライアントは、以下公式サイトからダウンロードする。

インストーラのサイズは約80KBと極めて容量が小さく、インターネット経由でダウンロードしてインストールをするようだ。

2. WireGuardのconfファイル作成

Windows用のWireGuardクライアントも設定ファイルを読み込ませることで設定投入が可能となる。

設定ファイルの内容は以下の通りとなる。[Interface]は自分側の設定となり、[Peer]は対向側の設定となる。

[Interface]

設定値 設定内容
Address WireGuardクライアントで使用するIPアドレスを指定。
PrivateKey wgclient.keyの内容を指定。

[Peer]

設定値 設定内容
PublicKey wgserver.pubの内容を指定。
AllowedIPs 対向先の接続機器と通信をさせるIPアドレスを記載する。通常はWireGuardサーバのIPアドレスと自宅のプライベートアドレスを指定すればよい。もしすべての通信をWireGuardのVPN経由とさせる場合は、0.0.0.0/0を指定する。
Endpoint 自宅のグローバルIPまたはDDNS名などを設定している場合はFQDNを用いて[IP or FQDN]:[ポート番号]の形式で接続先のWireGuardサーバを指定する。

今回は以下のように設定ファイルを作成した。

[Interface]
PrivateKey = [wgclient.keyの内容を指定]
Address = 10.0.33.11/32

[Peer]
PublicKey = [wgserver.pubの内容を指定]
AllowedIPs = 10.0.33.1/32, 192.168.0.0/16
Endpoint = [自宅のグローバルIP or FQDN]:[ポート番号]

3. 設定ファイルのインポート

WireGuardクライアントにて「トンネルの追加」→「トンネルをファイルからインポート」を選択し、先ほど作成した設定ファイルをインポートする。

4. 接続確認

インポート後「有効化」ボタンを押す。ただし、WireGuardサーバと接続の成功・失敗に関係なく有効化はされるので、実際の接続状況はPingなどで確認をすること。

WireGuardサーバ側ではwgコマンドにて接続状態を確認することができる。

# wg
interface: wg0
  public key: XXXX
  private key: (hidden)
  listening port: 51820

peer: XXXX
  endpoint: 1.2.3.4:1025
  allowed ips: 10.0.33.11/32
  latest handshake: 18 seconds ago
  transfer: 902.41 KiB received, 897.92 KiB sent

以上でWireGuardサーバを構築しインターネット経由で自宅環境へアクセスすることができた。

参考

更新履歴

  • 2021/11/6 新規作成
  • 2021/11/8 リモートデスクトップ接続不可の事象を解消するため、MTUを設定する旨を追記

人気の投稿