Amazon Linux2023のAD連携とフォルダアクセス権設定

AWSでのファイル共有サービスはマネージドでFSx for WindowsやEFSがありますがマネージドゆえの制限もあります。ちょっとしたファイルサーバ欲しいけどEC2のWindowsインスタンスはお高いという場合にお安いLinux系のファイルサーバはいかがでしょうか？ということで需要の有無は微妙な気がしますがAmazonLinux2023でファイルサーバ構築を構築して、AD連携させ管理する環境を構築します。

# 今回のゴール
AWSの環境を図にするとこんな感じです。
![AD連携.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/98ee06fd-c0ef-295e-e857-83d1f88add71.png)

具体的にやりたいことはLinux上の共有ディレクトリだけどADでアクセス権管理（Windowsっぽく）設定できるようにすることです。


![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1f798b81-7f1a-7c1c-6020-e497b9a4b117.png)

こんな感じでWindowsでのファイルサーバ管理っぽくLinuxファイルサーバ(上の図のAL2023)のアクセス権も管理したいと思います。

# 前提
・ ADはWindows Server 2019で構築
・ ファイルサーバはAmazonLinux2023(AL2023)を利用
・ ファイルサーバ機能はSamba利用（インストールはAWS指定リポジトリより）
・ ドメイン参加はsssdを利用し、ADとのフォルダアクセス権認証連携はwinbindを利用

# 構築内容
① ADサーバ（EC2:Windows）とファイルサーバ(EC2:AL2023)のデプロイ
② ファイルサーバの環境設定
③ ファイルサーバのドメイン参加
④ ファイルサーバへのSambaインストール、共有ディレクトリ設定
⑤ WbindでADとのフォルダアクセス権認証連携


# 実際の手順
#### ①ADサーバ（EC2:Windows）とファイルサーバ(EC2:AL2023)のデプロイ

こちらに関してはVPCの作成、EC2がメインとなり、他に詳細な記事がありますので割愛します。EC2のドメイン参加に必要なDNSサーバの設定について、AWS環境は少しクセがあります。色々とやり方はあると思いますが今回は一番簡単だと思うVPCのDHCPオプションを利用してDNSを配布しました。

[DHCP オプションセットの作成](https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/dhcp_options_set.html)

#### ②ファイルサーバの環境設定
EC2がデプロイできたところで以下手順でAL2023の環境を整えていきます。

    #アップデート
    dnf -y update
    #日本語化
    localectl set-locale LANG=ja_JP.UTF-8
    #タイムゾーンを日本時間に設定
    timedatectl set-timezone Asia/Tokyo
    #サーバホスト名を設定
    hostnamectl set-hostname samba-server
    #SELinuxを無効化
    vim /etc/selinux/config
    SELINUX="permissive"を"disabled"に変更
    #再起動
    reboot

#### ③ファイルサーバのドメイン参加
ドメイン参加させるためにはWindowsクライアントと同様にDNSがADサーバに向いている必要があります。

    #DNS設定の確認
    cat /etc/resolv.conf
    以下のように記載されていることを確認

    nameserver 10.0.0.XXX（ADサーバのIPアドレス）
    search XXX.internal（参加予定のドメイン）

次に必要なパッケージをインストールしていきます。

    #パッケージインストール
    dnf -y install realmd
    dnf -y install sssd adcli samba-common-tools
    dnf -y install krb5-workstation
    dnf -y install oddjob oddjob-mkhomedir

ドメイン参加前にドメインの情報が取得できるか確認します。
    
    #realm discover"ドメイン名"で情報を取得
     realm discover XXX.internal 
    
    以下のように表示されていればOK
      type: kerberos（←kerberosとなっていること）
      realm-name: XXX.INTERNAL（←ドメイン名となっていること
      domain-name: XXX.internal（←ドメイン名となっていること
      configured: no
      server-software: active-directory
      client-software: sssd
      required-package: oddjob
      required-package: oddjob-mkhomedir
      required-package: sssd
      required-package: adcli
      required-package: samba-common-tools

取得できることが確認できたところで、ドメイン参加します。

    #ドメイン参加
    realm join -U administrator@XXXX.INTERNAL xxx.internal --verbose
    ※administrator@XXX.INTRENALの部分の@以降は大文字

    以下表示がでればOK
    * Successfully enrolled machine in realm

これでドメイン参加まではできたので、AD側でもファイルサーバのコンピュータオブジェクトが追加されています。

ファイルサーバ側でもドメインユーザ情報が取得できるか確認します。

    # ドメインのadministratorの情報が取得できるか確認
    id administrator@XXX.internal
    以下のように表示が出ればOK
    uid=xxxxxxx gid=xxxxx
     

ついでにドメインユーザでSSHログインできるようにするしておきましょう。

    # ドメインのadministratorでSSHできるように設定追加
    sudo visudo
    以下追記
    administrator@XXX.internal	ALL=(ALL)	ALL

#### ④ ファイルサーバへのSambaインストール、共有ディレクトリ設定
まずファイルサーバ機能のSambaをインストールします。

    # sambaインストール
    dnf -y install samba
    # サービスを起動
    systemctl start smb nmb
    # 次回サーバ起動時にサービスを自動起動
    systemctl enable smb nmb

次にSambaで/home下にshareというとディレクトを作成し、共有する設定になるように設定コンフィグに追記していきます。。

    vim /etc/samba/smb.conf
    以下を記述

    [share]
    comment = Share Folder for All Users
    path = /home/share/
    browsable = yes
    read only = no

これだけだと設定コンフィグに記載しただけで、実際に/home/share/ディレクトはできていないのでディレクトリを作成します。

    # ディレクトリ作成
    mkdir /home/share
    # 権限と所有者の設定変更
    chmod -R 777 /home/share
    chown -R nobody:nobody /home/share

追記が終わったら反映のためサービスを再起動しましょう。

    # Sambaサービスを再起動
    systemctl restart smb nmb



これで共有フォルダができました。

#### ⑤ WbindでADとのフォルダアクセス権認証連携 

ここから共有フォルダのアクセス権をADで設定できるように認証連携をする設定をしていきます。

    # 認証連携に必要なパッケージをインストール
    yum -y install samba-winbind
    # サービス起動および再起動後に自動起動の設定
    systemctl start winbind.service
    systemctl enable winbind.service

次にSambaの設定コンフィグで認証にADを利用するように設定を記載

    # Samba設定コンフィグを修正
    vim /etc/samba/smb.conf

    [global]セクションの以下部分を編集

    [global]
        workgroup = XXX（ドメインのNETBIOS）
        security = ads
        realm = XXX.INTERNAL

次にケルベロス認証で該当ドメインのドメインコントローラーと認証できるように設定コンフィグを修正

    # ケルベロス設定コンフィグを修正
    vim /etc/krb5.conf

    以下のように該当セクションを修正
    [realms]
     XXX.INTERNAL = {
         kdc = kerberos.xxx.internal
         admin_server = kerberos.xxx.internal
     }

    [domain_realm]
    .xxx.internal = XXX.INTERNAL
    xxx.internal = XXX.INTERNAL

設定を反映させるためサービス再起動します。

    systemctl restart sssd
    systemctl restart winbind
    systemctl restart smb nmb 
    

これで認証連携ができているはずなので、ドメインのadministratorでケルベロス認証のチケットが取得できるか確認しましょう。

    #ケルベロス認証のチケット確認
    kinit administrator@XXX.INTERNAL
　　　　※@以降は大文字
    正常に設定できていれば所属OUの情報などが出力されると思います。

ではSambaでのドメイン連携していきます。

    #ドメイン連携
    net ads join -U administrator

    以下は表示されても無視でＯＫ
    Using short domain name -- XXX
    Joined 'SAMBA-SERVER' to dns domain 'xxx.internal'
    No DNS domain configured for samba-server. Unable to perform DNS Update.
    DNS update failed: NT_STATUS_INVALID_PARAMETER

　　　※上記エラーが出ないように/etc/hostsファイルなど色々変更してみましたがどうしても出てしまう...

本当にちゃんとドメイン参加できているか確認します。

    #ドメイン参加確認
    net ads testjoin
    以下表示が出ることを確認
    ”Join is OK”


またファイルサーバ側かもドメインコントローラーの情報が取れていることを確認します。
    
    # 必要なツールのインストール
    dnf install -y samba-winbind-clients
    # ドメインコントローラーに登録されているユーザ情報の取得
    wbinfo -u

    ドメインコントローラに登録されているユーザ情報が以下のように表示されることを確認
     XXX\administrator
     XXX\guest
　　　

これでSamba上の共有ディレクトリのフォルダを右クリックして、「セキュリティ」タブからADのユーザを選択して、権限を付与することができるようなっています。

# 注意点
・「realm join」コマンドや「kinit」コマンドでユーザIDを入力するときに＠以降を小文字で入力するとエラーになります。

・ファイルサーバ側に作成した共有ディレクト（今回は/home/share）はWindowsでいうと「フォルダ」ではなく、「共有」となります。「共有」のアクセス権はファイルサーバ側＝Samba側で設定となるので、あくまでADでアクセス権管理できる「フォルダ」は一階層下の部分（今回だと/home/share/test）からになります。

# おわりに
意外とこの手の記事って検索しても出ないですが需要的にはどうなんでしょうか？小規模環境ならNASを購入した方が安いような気もしますが...
早くインフラ構築できて、コードも書けるつよつよSEになりたい。AWS BootCamp頑張りましょう。

# 参考にしたサイト

https://qiita.com/gitya107/items/fcf32350ac9e25ab65d1

https://hana-shin.hatenablog.com/entry/2022/03/16/204640

https://syachiku.net/linux-activedirectory-jpin/

https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/join_linux_instance.html

https://stackoverflow.com/questions/40655220/couldnt-get-kerberos-ticket-for-realm