🐟

Arch Linux を NAS 用にセットアップ

2020/10/04に公開

Arch Linux をインストールして LDAP 認証に対応した NAS を構築した時のメモです。

Arch Linux のインストール

以下のページを参考にインストールを行いました:

OS のインストール,固定IP化,sudo, vim, sshd, pikaur の導入を行いました。

LDAP 認証

LDAP クライアントをインストール・セットアップして LDAP 認証でログインできるようにします。

LDAP サーバのセットアップは別の記事にまとめましたので参考にしてください
Raspberry Pi で LDAP サーバの構築(LDAPS (Secure LDAP) 対応) - Qiita

この記事では LDAP サーバはすでに構築済みである前提で進めます。

LDAP サーバへの接続

まずは LDAP サーバへ接続できるようにします。

最初にホスト名を解決できるように /etc/hosts を編集します (IPアドレス・ホスト名共にダミー,各環境に合わせて設定してください):

/etc/hosts
+ 192.168.x.yyy ldap.home.local

(LDAPS 導入のため,ホスト名を解決できるようにしています。)

次に OpenLDAP をインストールします:

$ pikaur -S openldap

続いて LDAP クライアントの設定ファイル /etc/openldap/ldap.conf を編集します:

/etc/openldap/ldap.conf
BASE dc=home,dc=local
URI ldaps://ldap.home.local

設定が成功しているかは以下のコマンドでテストできます:

$ ldapsearch -D "cn=admin,dc=home,dc=local" -W '(objectclass=*)'

注: 以下のようにアナウンスされていますが,現状設定していません。
接続できているため今回は設定しませんが,必要に応じて設定してください。

SSL を使う場合は:
・URI エントリのプロトコル (ldap または ldaps) は slapd の設定と一致しなくてはなりません。
・自己署名証明書を使う場合は、ldap.confTLS_REQCERT allow という行を追加してください。
・認証局により署名された証明書を使う場合、ldap.confTLS_CACERTDIR /usr/share/ca-certificates/trust-source という行を追加してください。

参考

LDAP 認証を有効にする

クライアント側のログインに LDAP の認証情報を用いるようにします。

まずは nss-pam-ldapd をインストールします:

$ pikaur -S nss-pam-ldapd

続いて /etc/nsswitch.conf を編集します:

/etc/nsswitch.conf
- passwd: files mymachines systemd
+ passwd: files ldap mymachines systemd
- group: files mymachines systemd
+ group: files ldap mymachines systemd
- shadow: files
+ shadow: files ldap

次に /etc/nslcd.conf の uri と base を編集します:

/etc/nslcd.conf
- uri ldap://127.0.0.1/
+ uri ldaps://ldap.home.local/
~~~~~
- base dc=example,dc=local
+ base dc=home,dc=local

ここまで終わったら nslcd.service の自動起動の有効かと実際に起動しましょう:

$ sudo systemctl enable nslcd.service
$ sudo systemctl start nslcd.service

無事起動できましたら,以下のコマンドを実行して LDAP のユーザが一覧に出てきたら設定は成功です:

$ getent passwd

認証情報を取得できるようになりました。
次は LDAP の認証情報でログインできるように設定します。

まずは /etc/pam.d/system-auth を編集します:

/etc/pam.d/system-auth
#%PAM-1.0

+ auth      sufficient pam_ldap.so
auth      required  pam_unix.so     try_first_pass nullok
auth      optional  pam_permit.so
auth      required  pam_env.so

+ account   sufficient pam_ldap.so
account   required  pam_unix.so
account   optional  pam_permit.so
account   required  pam_time.so

+ password  sufficient pam_ldap.so
password  required  pam_unix.so     try_first_pass nullok sha512 shadow
password  optional  pam_permit.so

session   required  pam_limits.so
session   required  pam_unix.so
+ session   optional  pam_ldap.so
session   optional  pam_permit.so

次に /etc/pam.d/su を編集します (NAS なら不要な気もしますが一応):

/etc/pam.d/su
#%PAM-1.0
+ auth		sufficient	pam_ldap.so
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
- auth		required	pam_unix.so
+ auth		required	pam_unix.so use_first_pass
+ account		sufficient	pam_ldap.so
account		required	pam_unix.so
+ session		sufficient	pam_ldap.so
session		required	pam_unix.so

続いて /etc/pam.d/su-l も一応同じように編集します:

/etc/pam.d/su-l
#%PAM-1.0
+ auth		sufficient	pam_ldap.so
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
- auth		required	pam_unix.so
+ auth		required	pam_unix.so	use_first_pass
+ account		sufficient	pam_ldap.so
account		required	pam_unix.so
+ session		sufficient	pam_ldap.so
session		required	pam_unix.so

続いて、/etc/pam.d/passwd を編集します:

/etc/pam.d/passwd
#%PAM-1.0
+ password        sufficient      pam_ldap.so
#password	required	pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
#password	required	pam_unix.so sha512 shadow use_authtok
password	required	pam_unix.so sha512 shadow nullok

ここまで作成したら,システムをリブートして実際にログインしてみましょう。
LDAP のアカウント名で SSH にログインできると思います。

このセクションの詳細な解説やより発展的な設定は LDAP 認証 - ArchWiki を確認してください。

参考

ZFS に対応する

まずは依存パッケージをインストールします。
今回は zfs-linux をインストールします:

$ pikaur -S zfs-linux
$ sudo /sbin/modprobe zfs
$ sudo depmod -a
$ sudo zpool status

エラーが出なければ成功です。

ストレージプールのインポート

すでに構築済みの ZFS ストレージプールがあるため,ストレージプールの作成は飛ばします。
興味がある方は ZFS - ArchWiki に解説がありますので確認してください。

ここではすでにあるストレージプールのインポートの手順を紹介します。

まずは zpool import コマンドを実行してインポートしたいストレージプールが認識されているかを確認します:

$ sudo zpool import
   pool: Volume1
     id: 15778421xxxxxxxxxxxx
  state: ONLINE
 status: The pool was last accessed by another system.
 action: The pool can be imported using its name or numeric identifier and
	the '-f' flag.
   see: http://zfsonlinux.org/msg/ZFS-8000-EY
 config:

	Volume1                                       ONLINE
	  raidz2-0                                    ONLINE
	    sda                                       ONLINE
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE

今回はこの Volume1 というストレージプールをインポートします。
インポートは本来 zpool import [poolname] で実行できますが,今回は前に利用していたシステムから切り替える際に export していなかったため action にもある通り -f フラグを用いてインポートします。

$ sudo zpool import -f Volume1

インポート後,改めてステータスを確認するとアップグレードがあるそうなので,今回はアップグレードも実行しました:

$ sudo zpool status
  pool: Volume1
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
	still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
	the pool may no longer be accessible by software that does not support
	the features. See zpool-features(5) for details.
  scan: resilvered 2.40M in 0 days 00:00:02 with 0 errors on Sat May  2 08:35:44 2020
config:

	NAME                                          STATE     READ WRITE CKSUM
	Volume1                                       ONLINE       0     0     0
	  raidz2-0                                    ONLINE       0     0     0
	    sda                                       ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0

errors: No known data errors

$ sudo zpool upgrade Volume1
This system supports ZFS pool feature flags.

Enabled the following features on 'Volume1':
  large_dnode
  sha512
  skein
  edonr
  userobj_accounting
  encryption
  project_quota
  device_removal
  obsolete_counts
  zpool_checkpoint
  spacemap_v2
  allocation_classes
  resilver_defer
  bookmark_v2

$ sudo zpool status
  pool: Volume1
 state: ONLINE
  scan: resilvered 2.40M in 0 days 00:00:02 with 0 errors on Sat May  2 08:35:44 2020
config:

	NAME                                          STATE     READ WRITE CKSUM
	Volume1                                       ONLINE       0     0     0
	  raidz2-0                                    ONLINE       0     0     0
	    sda                                       ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0
	    ata-WDC_WD30EZRX-00D8PB0_WD-WCCXXXXXXXXX  ONLINE       0     0     0

参考

ホームディレクトリの変更

LDAP ユーザのホームディレクトリは通常のホームディレクトリとは別の ZFS プール下のディレクトリに作成するように設定します。
今回は LDAP に保存されているホームディレクトリは /home/<$username> のまま, /Volume1/home/<$username> がホームディレクトリとなるように設定します。

まずは /etc/nslcd.conf に以下を追加します:

/etc/nslcd.conf
+ filter	passwd (objectClass=person)
+ map	passwd homeDirectory	"/Volume1/home/$cn"

続いてログイン時,ホームディレクトリが存在しないときは作成されるように以下3ファイルを編集します。

/etc/pam.d/system-login を以下のように編集します:

/etc/pam.d/system-login
#%PAM-1.0

auth       required   pam_tally2.so        onerr=succeed file=/var/log/tallylog
auth       required   pam_shells.so
auth       requisite  pam_nologin.so
auth       include    system-auth

account    required   pam_tally2.so
account    required   pam_access.so
account    required   pam_nologin.so
account    include    system-auth

password   include    system-auth

session    optional   pam_loginuid.so
session    optional   pam_keyinit.so       force revoke
session    include    system-auth
session    optional   pam_motd.so          motd=/etc/motd
session    optional   pam_mail.so          dir=/var/spool/mail standard quiet
-session   optional   pam_systemd.so
session    required   pam_env.so
session    required   pam_mkhomedir.so skel=/etc/skel umask=0022

/etc/pam.d/su/etc/pam.d/su-l も以下のように編集しましょう:

/etc/pam.d/su,/etc/pam.d/su-l
#%PAM-1.0
auth            sufficient      pam_ldap.so
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		required	pam_unix.so use_first_pass
account         sufficient      pam_ldap.so
account		required	pam_unix.so
+ session         required        pam_mkhomedir.so skel=/etc/skel umask=0022
session         sufficient      pam_ldap.so
session		required	pam_unix.so

最後に /Volume1/home のパーミッションを整えます:

$ sudo chmod 755 /Volume1/home

以上で設定は完了です。
試しに SSH でログインすると期待通りホームディレクトリが生成されます。

参考

NFS 対応

NFS プロトコルでのファイル共有に対応します。
NFS では主に NAS - サーバ間のファイル共有を想定します。

Tinc セットアップ

NFS はセキュアではないため,Tinc を導入してセキュアな通信路を確保します。

まずは Tinc をインストールします:

$ pikaur -S tinc

設定用ディレクトリを作成します:

$ # nfsvpn というネットワーク名で構築する
$ sudo mkdir -p /etc/tinc/nfsvpn/hosts

設定ファイルとスクリプトを作成します:

$ sudo touch /etc/tinc/nfsvpn/tinc.conf
$ sudo touch /etc/tinc/nfsvon/tinc-up
$ sudo touch /etc/tinc/nfsvon/tinc-down

/etc/tinc/nfsvpn/tinc.conf:

/etc/tinc/nfsvpn/tinc.conf
Name = nas1
AddressFamily = ipv4
Interface = tun0

/etc/tinc/nfsvpn/tinc-up:

/etc/tinc/nfsvpn/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add  192.168.11.1 dev $INTERFACE
ip route add 192.168.11.0/24 dev $INTERFACE

/etc/tinc/nfsvpn/tinc-down:

/etc/tinc/nfsvpn/tinc-down
#!/bin/sh
ip route del 192.168.11.0/24 dev $INTERFACE
ip addr del 192.168.11.1 dev $INTERFACE
ip link set $INTERFACE down

今回,NFS 系の VPN は 192.168.11.0/24 をネットワーク部とするネットワークで構築します。
tinc-uptinc-down には実行権限を付与します:

$ sudo chmod a+x /etc/tinc/nfsvpn/tinc-up /etc/tinc/nfsvpn/tinc-down

次に VPN の各ノードの情報ファイルを作成します:

$ sudo touch /etc/tinc/nfsvpn/hosts/nas1

/etc/tinc/nfsvpn/hosts/nas1:

/etc/tinc/nfsvpn/hosts/nas1
Address = 192.168.0.xx
Port = 655
Subnet = 192.168.11.1/24

最後に自身のファイルに公開鍵を書き込みます。
鍵の生成&書き込みは以下のコマンドで一発です:

$ sudo tincd -n nfsvpn -K

/etc/tinc/nfsvpn/hosts/nas1 を確認すると公開鍵が追記されていると思います。
また,秘密鍵ファイル /etc/tinc/nfsvpn/rsa_key.priv が生成されているはずです。

以下のコマンドでプログラムを実行します:

$ sudo tincd -n nfsvpn

問題なくプロセスが実行されることを確認したら,自動起動の設定を行います:

$ sudo systemctl enable tinc
$ sudo systemctl enable tinc@nfsvpn

実際に NAS を再起動して問題なく起動時にプログラムが実行されることを確認します:

$ sudo systemctl status tinc
$ sudo systemctl status tinc@nfsvpn

NFS セットアップ

いよいよ NFS のライブラリのインストールとセットアップを行います。

まずはライブラリのインストールをします:

$ pikaur -S nfs-utils

次に NFS で共有したいディレクトリをバインドマウントします (今回は ZFS のプール下をバインドマウント):

$ mkdir -p /srv/nfs4/music

/etc/fstab:

/etc/fstab
 + /Volume1/music		/srv/nfs4/music		none	bind,defaults,nofail,x-systemd.requires=zfs-mount.service	0 0

その後,NFS での共有設定を行うため /etc/exports を編集します:

/etc/exports
+ /srv/nfs4/music 192.168.11.0/24(rw)

NFS の詳しい設定は参考ページなどを確認してください。

設定を更新したら,反映します:

$ # NFS サーバ起動時は下のコマンドで更新後の設定を読み込む(今回は行わなくても良い)
$ sudo exportfs -arv

その後,NFS サーバを起動します:

$ sudo systemctl start nfs-server

問題なく接続・マウント・編集できたら,NFS サーバの自動起動を有効化します:

$ sudo systemctl enable nfs-server

参考

まとめ

Arch Linux で NAS のセットアップとして以下を行いました。

  • LDAP 認証の導入
  • ZFS の有効化
  • ログイン時のホームディレクトリの作成
  • NFS のセットアップ

また必要なものが出てきたら更新します。

Discussion