Arch Linux を NAS 用にセットアップ
Arch Linux をインストールして LDAP 認証に対応した NAS を構築した時のメモです。
Arch Linux のインストール
以下のページを参考にインストールを行いました:
- インストールガイド - ArchWiki
- Arch Linuxの最小限インストール - Qiita
- Arch Linuxの初期設定 – makoのノート
- ユーザーとグループ - ArchWiki
- Sudo - ArchWiki
- Secure Shell - ArchWiki
- actionless/pikaur: AUR helper with minimal dependencies. Review PKGBUILDs all in once, next build them all without user interaction.
OS のインストール,固定IP化,sudo, vim, sshd, pikaur の導入を行いました。
LDAP 認証
LDAP クライアントをインストール・セットアップして LDAP 認証でログインできるようにします。
LDAP サーバのセットアップは別の記事にまとめましたので参考にしてください
→ Raspberry Pi で LDAP サーバの構築(LDAPS (Secure LDAP) 対応) - Qiita
この記事では LDAP サーバはすでに構築済みである前提で進めます。
LDAP サーバへの接続
まずは LDAP サーバへ接続できるようにします。
最初にホスト名を解決できるように /etc/hosts
を編集します (IPアドレス・ホスト名共にダミー,各環境に合わせて設定してください):
+ 192.168.x.yyy ldap.home.local
(LDAPS 導入のため,ホスト名を解決できるようにしています。)
次に OpenLDAP をインストールします:
$ pikaur -S openldap
続いて LDAP クライアントの設定ファイル /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.conf
にTLS_REQCERT allow
という行を追加してください。
・認証局により署名された証明書を使う場合、ldap.conf
にTLS_CACERTDIR /usr/share/ca-certificates/trust-source
という行を追加してください。
参考
LDAP 認証を有効にする
クライアント側のログインに LDAP の認証情報を用いるようにします。
まずは nss-pam-ldapd をインストールします:
$ pikaur -S nss-pam-ldapd
続いて /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 を編集します:
- 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
を編集します:
#%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 なら不要な気もしますが一応):
#%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
も一応同じように編集します:
#%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
を編集します:
#%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
に以下を追加します:
+ filter passwd (objectClass=person)
+ map passwd homeDirectory "/Volume1/home/$cn"
続いてログイン時,ホームディレクトリが存在しないときは作成されるように以下3ファイルを編集します。
/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
も以下のように編集しましょう:
#%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 でログインすると期待通りホームディレクトリが生成されます。
参考
- nslcd.conf(5) - Linux man page
- linux - Include gid in home directory map with nslcd - Super User
- LDAP 認証 - ArchWiki
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
:
Name = nas1
AddressFamily = ipv4
Interface = tun0
/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
:
#!/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-up
と tinc-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
:
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
:
+ /Volume1/music /srv/nfs4/music none bind,defaults,nofail,x-systemd.requires=zfs-mount.service 0 0
その後,NFS での共有設定を行うため /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