#author("2020-08-02T04:54:48+00:00","default:sysosa","sysosa") #author("2020-08-02T05:05:10+00:00","default:sysosa","sysosa") samba-ADで提供されているkerberos認証を使ってNFSをよりセキュアにしてみる. 大抵NFSはUIDさえ合っていれば権限が奪えてしまいます. /etc/exportsでNFS公開範囲制限とroot_squashを施せば多少安心?かもしれないが、 動いていない計算機のIPを使いNFSマウントできてしまえばUIDに関わらず読めてしまう. それを防ぐために NFS にも認証を設ける方法がある. ***nfsサービスプリンシパルを設ける [#m2dade07] nfsサーバ/クライアント両方に nfsサービスプリンシパル を設けます。 nfsサービスプリンシパルの付け方ですが、一旦adサーバにnfsサーバ/クライアント共に「net ads join」にて参加させて、 その後、adサーバにてnfsサービスプリンシパルを設けます。参加方法はこちら参照[[samba/Linux参加]] -ADに参加 #code(nonumber){{ (nfsサーバ) [root@nfs ~]# net ads join -Uadministrator (nfsクライアント) [root@client ~]# net ads join -Uadministrator }} -adサーバにてnfsサービスプリンシパルを追加 #code(nonumber){{ (nfsサーバ向けにnfsサービスプリンシパルを加える) [root@ad ~]# /opt/samba/bin/samba-tool spn add nfs/nfs.biosym.local nfs$ (nfsクライアント向けにnfsサービスプリンシパルを加える) [root@ad ~]# /opt/samba/bin/samba-tool spn add nfs/client.biosym.local client$ (確認) [root@ad ~]# /opt/samba/bin/samba-tool spn list nfs$ [root@ad ~]# /opt/samba/bin/samba-tool spn list client$ [root@ad ~]# }} -nfsサーバ/クライアントにて初回に得た krb5.keytab ファイルを削除して、再度 ad に参加させる #code(nonumber){{ (nfsサーバ) [root@nfs ~]# rm -rf /etc/krb5.keytab [root@nfs ~]# net ads join -Uadministrator (nfsクライアント) [root@client ~]# rm -rf /etc/krb5.keytab && net ads join -Uadministrator }} -/etc/krb5.confの設定 ごくごく最低限としては下記のようにする. kdc/realmの情報をsambaのadから取得します #code(nonumber){{ [libdefaults] default_realm = BIOSYM.LOCAL dns_lookup_realm = true dns_lookup_kdc = true }} ***nfsサーバでnfsサービスの設定を行う [#ydede0a5] 肝心のnfsサービスを構築します 「nfs-utils」パッケージをインストールして、擬似ファイルシステムベースで「/etc/exports」を作る。/nfsを起点にしてます。 #code(nonumber){{ [root@nfs ~]# yum install nfs-utils [root@nfs ~]# systemctl enable nfs-server && systemctl start nfs-server [root@nfs ~]# mkdir -p /nfs/home [root@nfs ~]# mount --bind /home /nfs/home [root@nfs ~]# echo "/home /nfs/home none bind 0 0" >> /etc/fstab [root@nfs ~]# vi /etc/exports /nfs gss/krb5(rw,sync,fsid=0) /nfs/home gss/krb5(rw,sync,nohide) [root@nfs ~]# exportfs -avr }} firewallの設定も行う。&size(10){「/usr/lib/firewalld/services/」に定義可能なサービスがある}; #code(nonumber){{ [root@nfs ~]# firewall-cmd --add-service={mountd,nfs,rpc-bind} --permanent [root@nfs ~]# firewall-cmd --reload }} ***krb5でマウント [#q97a94c6] コマンドベースで #code(nonumber){{ [root@client ~]# yum install nfs-utils && reboot [root@client ~]# mount -t nfs -o sec=krb5 nfs:/home /home <-- /etc/hostsにnfsサーバが存在すれば短縮名で行ける }} とすれば行ける。確認はmountコマンドとかで #code(nonumber){{ [root@client ~]# mount | grep nfs:/home nfs:/home on /home type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5,clientaddr=10.10.0.2,local_lock=none,addr=10.10.0.3) }} っと「sec=krb5」となっています。 ***nfs通信の整合性チェック、暗号化 [#b8b9c2d2] nfsサーバ側で/etc/exportsの中身を #code(nonumber){{ /nfs gss/krb5(rw,sync,fsid=0) gss/krb5i(rw,sync,fsid=0) gss/krb5p(rw,sync,fsid=0) /nfs/home gss/krb5(rw,sync,nohide) gss/krb5i(rw,sync,nohide) gss/krb5p(rw,sync,nohide) }} として「exportfs -avr」を実行後、 nfsクライアントでsec欄にkrb5iなら、チェックサムで改竄防止機能付き、krb5pでnfsトラフィックの暗号化がなされる #code(nonumber){{ (チェックサム) [root@client ~]# mount -t nfs4 -o sec=krb5i,vers=4.1 nfs:/home /home (nfsトラフィックの暗号化) [root@client ~]# mount -t nfs4 -o sec=krb5p,vers=4.1 nfs:/home /home }} ***めも [#ab25ada2] 「gssproxy: gssproxy[1591]: (OID: { 1 2 840 113554 1 2 2 }) Unspecified GSS failure. Minor code may provide more information, Client 'host/client.biosym.local@BIOSYM.LOCAL' not found in Kerberos database」とかのエラーがでる場合は /etc/sysconfig/nfsで「GSS_USE_PROXY="no"」として再起動 ***ADに参加してないのにnfsマウントをすると [#g51b9176] #code(nonumber){{ [root@client2 ~]# mount -t nfs nfs.biosym.local:/home /home mount.nfs: access denied by server while mounting nfs.biosym.local:/home [root@client2 ~]# }} と拒否される nfsサーバ側には #code(nonumber){{ Aug 2 13:53:18 nfs rpc.mountd[922]: refused mount request from 10.10.0.4 for /home (/home): unmatched host }} と記録される。 もちろんnfsサーバの/etc/exportsが従来の方式を含んでいるなら #code(nonumber){{ [root@nfs ~]# cat /etc/exports /nfs gss/krb5(rw,sync,fsid=0) 10.10.0.0/24(rw,sync,fsid=0) /nfs/home gss/krb5(rw,sync,nohide) 10.10.0.0/24(rw,sync,nohide) [root@nfs ~]# exportfs -avr exporting 10.10.0.0/24:/nfs/home exporting 10.10.0.0/24:/nfs exporting gss/krb5:/nfs/home exporting gss/krb5:/nfs [root@nfs ~]# }} ADに参加していないnfsクライアント側でもmountできる #code(nonumber){{ [root@client2 ~]# mount -t nfs -o sec=sys nfs.biosym.local:/home /home [root@client2 ~]# df -Th /home Filesystem Type Size Used Avail Use% Mounted on nfs.biosym.local:/home nfs4 15G 1.5G 14G 11% /home [root@client2 ~]# }}