先日、CentOS7で運用していた共有ディレクトリを他のサーバーからマウントできなくなりました。 原因としてはサーバー側のSambaのバージョンを上げたため、古いクライアントからのアクセスが拒否されるようになったようです。
現象
以下の構成で運用しています。
- サーバー側(CentOS)
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
$ uname -r
3.10.0-514.10.2.el7.x86_64
$ smbd --version
Version 4.6.2
- クライアント側(Red Hat Enterprise Linux)
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
$ uname -r
2.6.18-194.17.4.el5
$ mount -V
mount (util-linux 2.13-pre7)
サーバー側は自動アップデートにより最新の状態を保っており、クライアント側はかなり古い状態のままにしています。
ふと気づいたらクライアント側からのマウントが切れており、再度マウントしようとしても以下のようにパーミッションが無いとエラーを吐くようになっていました。ユーザー名やパスワードは間違っておらず、別クライアントからは問題なく接続できています。
$ sudo mount //192.168.1.1/public /mnt/public -o defaults,credentials=/etc/samba/credentials
mount error 13 = Permission denied
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)
対処
ググったところmount
コマンドにsec=ntlm
を付ければいいという情報がありました。が今回はダメでした。この対処はつまり、サーバーとクライアントの認証方式(Security mode)がそれぞれ
- サーバー:NTLMv1
- クライアント:NTLMv2
となっている場合に、クライアントからNTLMv1を指定して接続すればよい、ということです。
今回に関しては、ログなどを見るとどうやらサーバー側のSambaのバージョンが上がっていたようです。 そこで最近のSambaの情報を集めてみたところ、認証方式についての変更の記述を発見。Samba 4.5.0からNTLMv1という方式がデフォルトで無効となり、NTLMv2のみの対応となったらしいです(参考:Samba 4.5.0 - Release Notes)。
つまり、
- サーバー:NTLMv2
- クライアント:NTLMv1
というわけです。
そこでひとまずクライアント側でNTLMv2を使用するように指定(-o sec=ntlmv2
)してみましたが失敗。
$ sudo mount //192.168.1.1/public /mnt/public -o defaults,credentials=/etc/samba/credentials,sec=ntlmv2
mount error 22 = Invalid argument
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)
どうやらクライアントのバージョンが古くNTLMv2には対応していないようです。ということで仕方なくサーバー側でNTLMv1へ対応する設定を追加しました(下記注意を参照)。
ここで注意なのが、global以外のセクションへこの設定を書くと以下のようなログが出力され設定が反映されないようです。
$ systemctl status smb.service
(中略)
Nov 16 12:34:56 hostname smbd[123456]: [2017/11/16 12:34:56.000000, 0] ../lib/param/loadparm.c:1809(lpcfg_do_service_parameter)
Nov 16 12:34:56 hostname smbd[123456]: Global parameter ntlm auth found in service section!
そして設定を再読み込み。
$ sudo systemctl reload smb.service
これでクライアントから無事接続できました。
注意
今回は認証方式をHTLMv1に揃えることで接続できない問題を解消しましたが、そもそもHTLMv1がデフォルトでオフとなったのは、それが非推奨となったためです。本来の解決方法としては、クライアント側のソフトウェアをアップデートするのが正解です。
ただし今回のケースでは、クライアント側のソフトウェアのアップデートが難しいことと、Sambaをかなり狭く閉じたネットワーク内においてのみ使用しており盗聴や攻撃の可能性が極めて低いであろうという考えがあるため、HTLMv1を許可することとしました。セキュリティレベルを下げることのリスクをしっかりと考慮した上で自己責任での対応をお願いいたします。