Sambaのアクセス制御をDNS名で実施するための設定

こんにちは、インフラエンジニア の 加藤(@kuromitsu_ka)です。

今回は、Sambaのアクセス制御をDNS名で実施したので必要だった設定を記載します。

エニグモ社では、令和の今もオンプレミスでSambaを利用した古き良きログの集約サーバが稼働しています。この度、オンプレミスのログサーバと同じ構成のものをAWSに構築することになりました。その際、Sambaのアクセス制御で少し工夫した部分があったので、ログを残します。

エニグモ社のログ集約サーバの仕組み

ログサーバからアプリサーバごとにディレクトリを作成して、Sambaインストール済みのサーバをログサーバからマウントすることでログを集約しています。インフラチームでない開発者は、基本的にサーバへSSHできないので、ログサーバだけアクセスを許可することで、ログを確認できるようにしています。

Sambaのアクセス制御をDNS名で設定する動機

オンプレミスのSambaのアクセス制御は、公開ディレクトリごとにIPセグメントやログサーバのIPを指定してアクセス許可設定しています。オンプレミスのサーバでは、プライベートIPが固定でしたが、AWSでは、サーバが再作成されても大丈夫なように、DNS名でアクセス制御することにしました。

  • オンプレミスでのSambaアクセス許可設定
hosts allow = ログサーバのIPや、本番環境のIPセグメント

AWSでは、SGでアクセス制御をしてもよかったのですが、運用上が面倒なのでSambaの設定でアクセス制御することとなりました。

  • AWSでの理想のSambaアクセス許可設定
hosts allow = ログサーバのホスト名

SambaサーバのDNS名でのアクセス制御に必要だった設定

ログサーバからマウントされるアプリやDBのサーバ(Sambaサーバ側)ではレコード引きを許可する設定と、ホワイトリスト設定が必要で、ログサーバ(Sambaクライアント側)では、ログサーバの逆引きレコードが必要でした。

必要だった設定(Sambaサーバ側)

ホスト名のIPをレコード引きを許可する設定が必要でした。

  • ホスト名検索の許可
dns proxy = yes
hostname lookups = yes
hosts allow = ログサーバのドメイン名

必要な設定(Sambaクライアント側)

Sambaのアクセスには、PTRレコードが必要でした。

  • CloudFormationでログサーバ作成と同時に逆引きレコードも設定できるようにしました。
RecordSetPtr:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: ${PTRレコードホストゾーン}
      Type: PTR
      Name: !Sub
        - ${FourthOctet}.${ThirdOctet}.${SecondOctet}.${FirstOctet}.in-addr.arpa
        - FirstOctet: !Select [0, !Split [ ".", !GetAtt Instance.PrivateIp ]]
          SecondOctet: !Select [1, !Split [ ".", !GetAtt Instance.PrivateIp ]]
          ThirdOctet: !Select [2, !Split [ ".", !GetAtt Instance.PrivateIp ]]
          FourthOctet: !Select [3, !Split [ ".", !GetAtt Instance.PrivateIp ]] 
      ResourceRecords:
        - !Sub
          - ${良きホスト名}
      TTL: 300

デバッグログ

SambaサーバのDNS名でのアクセス制御に、逆引きレコードが必要となった際のログです。

  • PTRレコードがない状態でのアクセス
    Sambaクライアント側からだと弾かれてしまいます。
[root@SambaClient ~]# mount.cifs //${Sambaサーバ}/test test -o vers=3.0,password=,dir_mode=0755 -vvv
mount.cifs kernel mount options: ip=10.195.101.57,unc=\\10.195.101.57\syslog,vers=3.0,dir_mode=0755,user=root,pass=********
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
  • Sambaサーバ側のログ
    IPベースで制御していそうでした。「matchname failed on 10.195.100.9」 ※この際、SambaクライアントのIPは10.195.100.9
Denied connection from 10.195.100.9 (10.195.100.9)
[2022/04/11 16:44:43.212303,  0] ../../source3/smbd/server.c:1788(main)
  smbd version 4.10.16 started.
  Copyright Andrew Tridgell and the Samba Team 1992-2019
[2022/04/11 16:44:43.266814,  0] ../../lib/util/become_daemon.c:136(daemon_ready)
  daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
[2022/04/11 16:44:45.916505,  0] ../../lib/util/access.c:365(allow_access)
  Denied connection from ip-10-195-100-9.ap-northeast-1.compute.internal (10.195.100.9)
[2022/04/11 16:45:17.430789,  0] ../../lib/util/access.c:365(allow_access)
  Denied connection from ip-10-195-100-9.ap-northeast-1.compute.internal (10.195.100.9)
  • 逆引きレコードのホスト名で、弾かれていることが判明しました。
# nslookup 10.195.100.9
9.100.195.10.in-addr.arpa       name = ip-10-195-100-9.ap-northeast-1.compute.internal.

Authoritative answers can be found from:

動作確認

DNS名で許可しているサーバからのみ、Sambaマウントできることを確認します。 許可しているログサーバのDNS名は、logserverです。

  • Sambaサーバの許可設定
[root@SambaServer ~]# cat /etc/samba/smb.conf
[global]
:
dns proxy = yes
hostname lookups = yes
:
include = /etc/samba/smb.d/test.conf
[root@SambaServer ~]#
[root@SambaServer ~]#
[root@SambaServer ~]# cat /etc/samba/smb.d/test.conf 
[test]
:
  hosts allow = 127. logserver
  • 逆引きを設定していおらず、アクセス許可もされていない他のクライアントからだと、Sambaマウントできない。
[root@NotAllowedSambaClient ~]# hostname -I
10.195.100.9
[root@NotAllowedSambaClient ~]#
[root@NotAllowedSambaClient ~]#
[root@NotAllowedSambaClient ~]# nslookup 10.195.100.9
9.100.195.10.in-addr.arpa       name = ip-10-195-100-9.ap-northeast-1.compute.internal.

Authoritative answers can be found from:

[root@NotAllowedSambaClient ~]#
[root@NotAllowedSambaClient ~]#
[root@NotAllowedSambaClient ~]# mount.cifs //${Sambaサーバ}/test test -o vers=3.0,password=,dir_mode=0755 -vvv
mount.cifs kernel mount options: ip=${Sambaサーバ}/,unc=\\${Sambaサーバ}/\test,vers=3.0,dir_mode=0755,user=root,pass=********
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
  • 逆引きレコード設定済みのアクセス許可のあるログサーバ(logserver)からだと、Sambaマウントできる。
[root@logserver ~]# hostname -I
10.195.116.243
[root@logserver ~]#
[root@logserver ~]#
[root@logserver ~]#  nslookup 10.195.116.243
243.116.195.10.in-addr.arpa     name = logserver.honyarara.com.

Authoritative answers can be found from:
[root@logserver ~]#
[root@logserver ~]#
[root@logserver ~]# mount.cifs //${Sambaサーバ}/test test -o vers=3.0,password=,dir_mode=0755 -vvv
mount.cifs kernel mount options: ip=${Sambaサーバ},unc=\\${Sambaサーバ}\test,vers=3.0,dir_mode=0755,user=root,pass=********
[root@logserver ~]#
[root@logserver ~]#
[root@logserver ~]# df -h
ファイルシス           サイズ  使用  残り 使用% マウント位置
:
//10.195.101.57/test    50G   19G   32G   38% /root/test

感想

今回は、古のシステムを触ったので供養ブログとなりましたが。
事例がパッと見つからない課題は、毎回取り組むのが楽しいです。
困った時は、ドキュメントを読むのが大事ですね。

株式会社エニグモ すべての求人一覧 hrmos.co