アイクラフト新人研修2016の技術研修では、「xrdpによるLinux仮想環境 (VDI) システムの構築」を課題に設定しました。この研修の成果物であるブログ記事を計5つ、シリーズでご紹介します。なお、ソフトウェアのバージョンなどの情報は、研修を実施した2016年3月時点のものです。(大久保)

(本ブログ記事の著者: 田﨑 慧)

1. 本記事の目的

オープンソース・ソフトウェアであるSambaを用いて、 Ubuntu Server上に、Windows環境でのユーザ管理に用いられる“Active Directory Domain Controller”サーバを構築します。

Sambaとは

Samba公式Wikiから引用:

Samba(「サンバ」と呼称します)は、以下の UNIX および UNIX互換マシンを Windows NT/2000互換のファイルサーバ/プリント・サーバにするオープン・ソース・ソフトウェアです。

端末間でファイル共有を行うためのファイルサーバ (プリントサーバ) としての認識が大多数かと思います。 そんなSambaには他にも機能が存在しています。 後述するActive Directory機能がそれに当たります。

Active Directoryとは

Active Directoryは主にユーザの認証に用いられるWindows Serverの機能です。 企業にとって重要なデータを、認証された人物のみが閲覧可能となるようにするのが主です。

データを保持するサーバが複数ある場合には、一度認証するのみで多数にアクセスできる「シングルサインオン」という仕組みがあり、 「ドメイン」という単位で管理することが出来ます。

社内の部署毎に管理することも可能です。

2. 構築内容

SambaADサーバ構築の全体の流れは、Samba公式のHOWTOに沿っています。

設定例は以下の通りです。

設定例

設定項目設定内容
OSUbuntu Server 14.04 LTS
Sambaバージョンversion 4.1.6
IPアドレス192.168.255.1
外部参照DNS192.168.55.10
ワークグループLIBREPC
ホスト名librepc12-samba
レルムLIBREPC.LOCAL
FQDNlibrepc12-samba.librepc.local
Samba管理者パスワードXXXXXXXX

3. 事前準備

ADサーバを構築したい端末に、 Ubuntu Server 14.04.2 LTS (64bit) をインストールします。

4. 作業内容

ネットワークの設定を行う

ホスト名を編集する

/etc/hosts を変更し、接続先としてわかりやすく設定します。

[/etc/hosts]

127.0.0.1     localhost
127.0.1.1     librepc12-samba

192.168.255.1 librepc12-samba librepc12-samba.librepc.local      #=> この行を追記する

固定IPアドレスを設定する

外部からの接続をする際、DNSからの検索を行えるよう固定IPアドレスを設定します。 /etc/network/interfaces を編集することで設定できます。

例ではeth0の項目を変更しています。

[/etc/network/interfaces]

auto eth0
#iface eth0 inet dhcp         #=> DHCPの設定行なのでコメントアウトする

### 以下の行を追記する 

iface eth0 inet static
address 192.168.255.1
network 192.168.255.0
netmask 255.255.255.0
broadcast 192.168.255.255
gateway 192.168.255.254

dns-nameservers 192.168.55.10

これによりネットワーク環境を静的に設定できます。 先ほどの設定をシステムに反映させるために、ネットワークインタフェースを再起動します。

### eth0を一度再起動する
$ sudo ifdown eth0 && sudo ifup eth0

パッケージのインストール

依存パッケージのインストール

Sambaに必要なLDAP関連の依存パッケージをインストールします。

### 一度aptライブラリの一覧を更新する
$ sudo apt-get update

#### LDAP関連のパッケージをインストールする
$ sudo DEBIAN_FRONTEND=noninteractive apt-get -y install slapd ldap-utils libnss-ldap

# DEBIAN_FRONTEND=noninteractive を付けない場合、ldapの設定を行ってしまうので注意
# (インストールのみ行いたい・ADを構築する上で設定する必要が無いので省いている)

# -y : [Y/n]で判断を行う部分を、全てY(yes)で答える

ここで出てくる DEBIAN_FRONTEND=noninteractive についてはこちらを参照 具体的な意味はこちらを参照

Sambaのインストール

ここでSamba本体をインストールします。

### Samba本体のインストールを行う
$ sudo apt-get -y install samba samba-doc smbldap-tools smbclient

その他依存パッケージインストール

他のSamba依存パッケージもインストールしておきます。 既にインストール済みのパッケージが存在すると出力される場合もあるが、無視していただいても結構です。

### Kerberosの設定が行われてしまうため、こちらも noninteractive でインストールのみ行う
$ sudo DEBIAN_FRONTEND=noninteractive apt-get -y install \
acl attr autoconf bison build-essential debhelper dnsutils docbook-xml docbook-xsl flex gdb krb5-user libacl1-dev libaio-dev libattr1-dev libblkid-dev libbsd-dev libcap-dev libcups2-dev libgnutls-dev libjson-perl libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl libpopt-dev libreadline-dev perl perl-modules pkg-config python-all-dev python-dev python-dnspython python-crypto xsltproc zlib1g-dev

LDAPの起動設定無効化

SambaADでLDAPを起動させておくとADが動作しない場合があります。 そのため、LDAPを無効化しておきます。

### LDAPのサービスを止める
$ sudo service slapd stop
### LDAPの自動実行を無効化する
$ sudo update-rc.d -f slapd remove

5. Sambaの構築

PATH通し

Samba関連のディレクトリにパスを通しておくことで、 Sambaのコマンドを パス(場所)で指定せず 使えるようになります。

### PATHの環境変数にSambaのパスを追加する
$ export PATH="/usr/local/samba/bin:/usr/local/samba/sbin:${PATH}"

設定ファイルのバックアップ

設定を変更する際に、いつでも復旧できるよう設定ファイルをコピーしておきます。

###Sambaの設定ファイルをバックアップ
$ sudo cp -i -p /etc/samba/smb.conf /etc/samba/smb.conf.backup

# -i : 上書きする恐れがある場合にユーザへ問い合わせる
# -p : ユーザやパーミッションを変えずにコピーする (sudoでコピーするとパーミッションが変わる場合がある)

### Kerberosの設定ファイルをバックアップ
$ sudo cp -i -p /etc/krb5.conf /etc/krb5.conf.backup

Sambaの設定ファイルを削除する

AD用に設定ファイルを生成していくが、既に設定ファイル(/etc/samba/smb.conf)が存在していると生成できません。 そのため、一度設定ファイルを削除しておきます。

### Sambaの設定ファイルを削除する
$ sudo rm /etc/samba/smb.conf

SambaのAD用設定ファイルを生成する

上述したように、AD用の設定ファイルを生成していきます。 Sambaの設定ファイルは samba-tool コマンドを用いることで生成できます。

### SambaADの設定ファイルを生成する
### オプションは設定項目を記述している
$ sudo samba-tool domain provision \
--use-rfc2307 \
--use-ntvfs \
--realm=LIBREPC.LOCAL \
--server-role=dc \
--dns-backend=SAMBA_INTERNAL \
--domain=LIBREPC \
--host-name=LIBREPC12-SAMBA \
--host-ip=192.168.255.1 \
--adminpass=XXXXXXXX \
--option="interfaces=lo eth0" \
--option="bind interfaces only=yes"

# 対話式で行いたい場合には $ sudo samba-tool domain provision --interactive
# のように --interactiveオプションを付けるが、コケてしまう

# --use-rfc2307 : UNIX用に調整する
# --use-ntvfs   : ファイルシステムをNTVFSにする
# --realm       : レルムを指定する
# --server-role : Sambaの動作を指定する
  #=> dc : ドメインコントローラとして動作する
  #=> member : 既存ADのメンバーとしてドメインに参加する
  #=> standalone : ファイルサーバとして動作する

# --dns-backend : ADとして動かす際のDNSサーバ機能をSamba内蔵のDNSにするかBINDにするか指定する
# --domain      : NetBIOS名を指定する(15文字以内・大文字のみ)
# --host-name   : サーバのホスト名を指定する
# --host-ip     : サーバのIPアドレスを指定する
# --adminpass   : Samba管理者のパスワードを指定する
  #=> 8文字以上、[英大文字・小文字・数字・記号]から3つの属性が最低限必要

# --option="interfaces=lo eth0" / --option="bind interfaces only=yes"
  #=> マルチプルネットワーク(ネットワークの掛け持ち)をする際に
  #=> IPv4, IPv6のIPアドレス自動設定を防止する

コマンド実行が無事に終わったらシステムを再起動します。

### 再起動を行う
$ sudo shutdown -r now

# -r : 再起動 (単純なシャットダウンなら -h)
# now : 処理を行う時間を指定する(nowなら今すぐ, 時刻や指定時間後も設定可能)

DNSの設定

Samba4では、内部でDNSの機能を用いることが可能です。 そこで、この端末 (今構築している端末) が参照するDNSサーバをこの端末自身に設定します。 また、外部との接続が行えるよう設定を施します。

[/etc/network/interfaces]

#dns-nameservers 192.168.55.10      #=> コメントアウトする

###以下を追記する
dns-nameservers 127.0.0.1
dns-search      librepc.local

設定後、ネットワークインタフェースを再起動します。

$ sudo ifdown eth0 && sudo ifup eth0

Kerberosの設定

SambaADではKerberosを用いてユーザ認証を行っています。 Kerberosインストール時にAD用設定ファイルが /var/lib/samba/private/krb5.conf として生成されているので、 /etc/ 以下にコピーし、編集します。

### バックアップ作成する
$ sudo cp -ip /etc/krb5.conf /etc/krb5.conf.backup2

### AD用設定ファイルをコピーする
$ sudo cp -ip /var/lib/samba/private/krb5.conf /etc/krb5.conf

# 既に/etc/krb5.confが存在しているので上書きの確認をされる
cp: overwrite '/etc/krb5.conf'?         #=> yを入れエンターキーを押す

追加でレルムの設定を行います。

[libdefaults]
    default_realm = LIBREPC.LOCAL
    dns_lookup_realm = false
    dns_lookup_kdc = true

### 以下を追記する

[realms]
    LIBREPC.LOCAL = {
        kdc = librepc12.librepc.local
        admin_server = librepc12.librepc.local
    }

[domain_realm]
    .librepc.local = LIBREPC.LOCAL
    librepc.local = LIBREPC.LOCAL

ADユーザを追加する

ADにユーザを登録 (追加) するには、samba-toolを使う方法を取ります。 まず、現段階のADユーザ一覧を確認します。

### ADユーザ一覧を確認する
$ sudo samba-tool user list
# 以下は一例
Administrator
krbtgt
Guest

新規にADのユーザを追加していきます。 (以下は test1 というユーザの例)

### ADのユーザアカウントを新規作成する
$ sudo samba-tool user add test1
 # samba-tool user add USERNAME : USERNAMEがユーザ名

New Password:     #=> パスワードを設定する (7文字以上かつ、英小大文字・数字・記号の組み合わせでなければならない)
Retype Password:  #=> 再度パスワードを入力
 # 上手くいった場合
User 'test1' created successfully

### 再度ユーザ一覧を確認
$ sudo samba-tool user list
Administrator
krbtgt
Guest
test1

その他の設定

ADにはレベルという概念があり、システムのバージョン間で互換性を持つようにしています。 (レベルについて詳しくはこちらを参照) デフォルトではWindows Server 2003なので、レベルをWindows Server 2008 R2まで上げます。

### 現在のレベルを確認する
$ sudo samba-tool domain level show
Domain and forest function level for domain 'DC=librepc,DC=local'

Forest function level:(Windows) 2003
Domain function level:(Windows) 2003
Lowest function level of a DC:(Windows) 2008 R2

### レベルをWindows 2008 R2相当まで上げる
$ sudo samba-tool domain level raise --domain-level 2008_R2 --forest-level 2008_R2

# 上手くいくと以下のようになる
Domain function level changed!
Forest function level changed!
All changes applied successfully!

### 再度レベルを確認する
$ sudo samba-tool domain level show
Domain and forest function level for domain 'DC=librepc,DC=local'

Forest function level:(Windows) 2008 R2
Domain function level:(Windows) 2008 R2
Lowest function level of a DC:(Windows) 2008 R2

6. 事後確認&作業

SambaADが動作しているか確認する

Sambaが共有している内容を確認する

SambaAD構築時には、デフォルトで [netlogon], [sysvol] というボリュームが存在しています。 それらを共有できているか確かめるべく、現在Sambaサーバとして共有しているものを確認します。

### 現在Sambaサーバが共有しているものを表示する
$ smbclient -L localhost -U%
Domain=[LIBREPC] OS=[Unix] Server=[Samba 4.1.6-Ubuntu]

        Sharename       Type      Comment
        ---------       ----      -------
        netlogon        Disk
        sysvol          Disk
        IPC$            IPC       IPC Service (Samba 4.1.6-Ubuntu)

Domain=[LIBREPC] OS=[Unix] Server=[Samba 4.1.6-Ubuntu]

        Server          Comment
        ---------       -------

        Workgroup       Master
        ---------       -------
        WORKGROUP       JCRAC-NAS

 # smbclient : SambaサーバのSMB/CIFSリソースへアクセスするクライアント
   #=> -L HOST        : サーバー上で利用可能なサービスの一覧を出力する(HOSTには接続先を指定)
   #=> -U USER%PASS : SMBのユーザ名、パスワードを指定する(USERはSambaのユーザ名、PASSはユーザのパスワードを入力)
                       #パスワードが空の場合は後で入力

Sambaの認証機能を確認する

Sambaユーザの認証が行えるかどうかを確認します。

### Sambaの管理者としてnetlogonボリュームの内容を見る(lsコマンドを実行する)
$ smbclient //localhost/netlogon -U Administrator -c 'ls'
Enter Administrator's password:
Domain=[LIBREPC] OS=[Unix] Server=[Samba 4.1.6-Ubuntu]
 .                              D       0   #ここに時刻が表示される
 ..                             D       0   #ここも時刻が表示される

                XXXXX blocks of size XXXXXXX. XXXXX blocks available

内蔵DNSが動作しているかを確認する

Samba内蔵のDNSが動作しているかを確認します。

### SRVレコードを表示する
$ host -t SRV _ldap._tcp.librepc.local
_ldap._tcp.librepc.local has SRV record 0 100 389 librepc12.librepc.local

$ host -t SRV _kerberos._tcp.librepc.local
_ldap._tcp.librepc.local has SRV record 0 100 389 librepc12.librepc.local

### Aレコードを表示する
$ host -t A librepc12.librepc.local
librepc12.librepc.local has address 192.168.255.1

$ host -t A google.co.jp
google.co.jp has address XXX.XXX.XXX.XXX

 # host : コマンドでDNSを検索しホスト名を表示する
  #=> -t : 指定したタイプで検索を行う
  
 # SRVは名前解決に用いるレコード
 # AはホストのIPアドレスのレコード

Kerberosが動作しているか確認する

Kerberos認証が動作しているかを確認します。 Kerberosでは、ユーザやサービスの認証をチケットによって行っているため、チケットを発行できるかを確認します。

### Kerberosの認証チケットを発行
$ kinit administrator@LIBREPC.LOCAL
Password for administrator@LIBREPC.LOCAL: #=> 管理者のパスワードを入力
 # 上手くいくと
Warning: Your password will expire in XX days on XXX #=> チケットの期限が表示される

チケットが受信できているかを確認します。

### Kerberosのチケット一覧を表示する
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrator@LIBREPC.LOCAL

Valid starting          Expires             Service principal
XXXXXXXXXXXXXX          XXXXXXXXXXXXX       krbtgt/LIBREPC.LOCAL@LIBREPC.LOCAL
    renew until XXXXXXXXXX

 # XXXには時刻が表示されている