CentOS7でdhcpとbindを連携させ家庭内DDNS

インストール

今回はDNSサーバーもDHCPサーバーも1台で兼任させる。
まずインストールする。
※Version bind9.9.4 dhcp4.2.5

# yum install dhcp bind

DNSサーバーの設定

bindから設定する。
下記の箇所の内容を変更または追記する。

options {
    // zoneファイルの保存場所
    directory "/var/named/";
    // ほかのdnsサーバーはいないのでno
    notify no;
    // LAN内からの問い合わせを許可
    allow-query {
        localhost;
        192.168.1.0/24;
    };
    // 自分で名前解決できないときの丸投げ先
    forwarders {
        192.168.1.254;
        8.8.8.8;
    };
};

zone "example.jp." {
    type master;
    file "example.jp.zone";
    // 自身からの変更を許可しておく
    allow-update {
        localhost;
    };
};

さっき指定したzoneファイルを作成する。
※admin.example.jp.の部分はadmin@example.jpという管理者のE-mailという意味

$TTL 86400
@    IN    SOA    dns.example.jp.    admin.example.jp. (
           2018042619
           10800
           36400
           604800
           86400
)

       IN    NS   dns.example.jp.
dns    IN    A    192.168.1.11

作成したらファイルの所有グループをnamedに変更して書き込み権限を設定する。
※namedに読み書きの権限を持たせるのが目的

# chgrp named /var/named/example.jp.zone
# chmod g+w /var/named/example.jp.zone

ついでに/var/named/の所有グループもnamedに変更して書き込み権限を設定する。
※namedに書き込みの権限を持たせるのが目的

# chgrp named /var/named/
# chmod g+w /var/named/

DHCPサーバーの設定

設定ファイルを下記のように編集する。

# DNSサーバーに更新要求を送信する設定
ddns-update-style interim;
# 普通のDHCPの設定
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.101 192.168.1.120;
    option routers 192.168.1.254;
    option domain-name "example.jp";
    option domain-name-servers 192.168.1.11;
    # 更新を通知するDNSサーバーを指定
    zone example.jp. {
        primary localhost;
    }
}

その他の必要な設定

SELinuxとFirewallに例外を追加する。

# setsebool -P named_write_master_zones true
# firewall-cmd --add-service=dns --permanent
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --reload

サービスを有効にして起動。

# systemctl enable named
# systemctl start named
# systemctl enable dhcpd
# systemctl start dhcpd

補足

nsupdate

nsupdateを使用してDNSサーバーを更新をテストするには bind-utils をインストールし、nsupdateコマンドを実行する。実行したら対話型コンソールになるので下記のような感じで入力する。何もエラーが出なければOK。

>server 127.0.0.1
>update add test.example.jp. 3600 A 192.168.1.222
>send
>server 127.0.0.1
>update delete test.example.jp.
>send
rndc

rndcでdumpして現在のDNSレコードを確認する。

# rndc dumpdb -zones
# cat /var/named/data/cache_dump.db | grep dns.example.jp.

CentOS7にVirtualBoxのリポジトリを追加する

公開鍵のインストール。

$ wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
# rpm --import oracle_vbox.asc

リポジトリを追加する。

$ wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo
# mv virtualbox.repo /etc/yum.repos.d/virtualbox.repo

CentOS7にWindowsからリモートデスクトップ

GNOME入ってなかったら入れて。

# yum groupinstall "GNOME Desktop"

xrdpのインストール。

# yum install epel-release
# yum install xrdp
# yum install tigervnc-server

/etc/xrdp/xrdp.iniの下記箇所を変更する。

#max_bpp=32
max_bpp=24

ファイアウォールに例外を登録する。

# firewall-cmd --add-port=3389/tcp --permanent
# firewall-cmd --reload

サービスを有効にして、起動。

# systemctl enable xrdp
# systemctl start xrdp

CentOS7でのSoftEtherVPNのインストール手順

OS:CentOS7 1708
SoftetherVPN:4.25

ビルドするためのパッケージをインストール。

# yum install kernel-devel
# yum install kernel-headers
# yum groupinstall "Development Tools"

http://www.softether-download.com/ja.aspx?product=softetherからOSに合ったVPN ServerのURLを取得しセットアップファイルを取得する。

$ wget [URL]

ダウンロードしたファイルを移動。

# mv ファイル名.tar.gz /usr/local/

ファイルを展開。

# tar xvzf ファイル名.tar.gz

インストールディレクトリに移動。

# cd /usr/local/vpnserver/

ビルドするためにmakeコマンドの実行。

# make

/etc/systemd/system/vpnserver.serviceを下記内容で作成する。

[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

自動起動を有効にして、サービスを起動する。

# systemctl enable vpnserver
# systemctl start vpnserver

一度ファイアウォールをOFFに。

# systemctl stop firewalld

設定ツールをさっきのとこからダウンロード。設定をウィザードでWindowsから行った。

下記ポート開放して、とりあえず動いてる。
50/tcp 500/udp 4500/udp

ファイアウォールをONに戻して、例外を登録する。

# systemctl start firewalld
# firewall-cmd --add-port=50/tcp --permanent
# firewall-cmd --add-port=500/udp --permanent
# firewall-cmd --add-port=4500/udp --permanent
# firewall-cmd --reload

CentOS7+Samba4のActiveDirectory環境でのSMB共有

CentOS7にSamba4(4.6.5)をインストールし、ActiveDirectoryを構築した環境でWindowsからSMBプロトコルでアクセスする。

※Samba4にてドメインコントローラーの構築が完了している前提

共有用のディレクトリを作成する。
今回は /home/samba/share/ でやる。

# mkdir /home/share/
# chmod 777 /home/share/

/usr/local/samba/etc/smb.confを編集する。

[global]
unix charset = UTF8
dos charset = CP932
netbios name = TEST-DC1
realm = LOCAL.EXAMPLE.COM
workgroup = EXAMPLE
dns forwarder = 8.8.8.8
server string = TEST-DC1
server role = active directory domain controller
idmap_ldb:use rfc2307 = yes

[share]
path = /home/share/
comment = EXAMPLE\AdministratorとEXAMPLE\DomainUsersのみが読み書き可能
read only = no
valid users = Administrator "@domain users"
inherit acls = yes
inherit owner = yes
inherit permissions = yes
vfs objects = acl_xattr streams_xattr

Sambaサービスを再起動して動作を確認する。

smb.conf の主なパラメーターについて

browseable このパラメーターは、net view コマンドやブラウズリスト中に現れる利用可能な共有の一覧にこの共有を表示させるかどうかを制御する。
既定値: browseable = yes
config file このオプションを指定することで、デフォルトの設定ファイル (通常smb.conf)の代わりのファイルを利用して、設定を上書きすることが可能になる。このオプション自身が config file 中に記述されるため、これには「鶏と卵」問題がある。
そのため、このパラメーターによって設定ファイルが変更されると、新しい設定ファイルの内容が先頭からロードされる。
このオプションには、通常の変数置換が適用されるので、うまく使えばとても便利であろう。
指定された設定ファイルが存在しない場合は読み込まれない (これにより、特定クライアントに対して、特別な設定ファイルを指定するということが可能となる)。
既定値なし
例: config file = /usr/local/samba/lib/smb.conf.%m
create mask ファイル作成時に付与されるパーミッションは、DOS の属性を UNIX のパーミッションに変換することにより生されるが、最終的には、このパラメーターとビット単位の AND 演算が行なわれる。このパラメーターは、ファイルのUNIX のパーミッションに対するビットマスクと考えることができる。ここで設定されないビットは、ファイル作成時のパーミッションから削除される。
このパラメーターの既定値は、「group」と「other」の書き込みおよび実行権を UNIX のパーミッションから取り除いた値である。
この処理に引続き、Samba はこのパラメーターにより生成されたパーミッションを force create mode パラメーターの値とビット単位の OR 演算を行なう。なおパラメーターの値はデフォルトで、000 に設定されている。
このパラメーターは、ディレクトリのパーミッション生成には関与しない。directory mask パラメーターを参照のこと。
このパラメーターは、Windows NT/2000 の ACL エディターにより設定されるアクセス許可には関与しない。管理者が ACL に対するビットマスクも同様に設定したいと考えている場合は、security mask の設定が必要である。
既定値: create mask = 0744
deadtime このパラメーターの値(10進の整数)は、接続が利用されなくなったとみなされて切断が行なわれるまでの経過時間(分)を表す。deadtime はオープンされているファイルが存在しない時のみ有効である。
このパラメーターは、多数の利用されていない接続によって、サーバー上のリソースが枯渇するのを防ぐのに有効である。
多くのクライアントは、このパラメーターをユーザーに意識させないように、接続が切断されていた際に、自動で再接続を行なう機能を持っている。
ほとんどのシステムにおいて、このパラメーターを利用して、数分でタイムアウトが発生するようにすることを推奨する。
deadtime が 0 の場合、タイムアウトによる自動的な切断は行なわれない。
既定値: deadtime = 0
例: deadtime = 15
delete readonly このパラメーターにより、読み取り専用のファイルの削除が可能になる。これは DOS の仕様ではないが、UNIX では可能な処理である。
このオプションは、rcs のようなアプリケーションを動作させるのに有用で、UNIX ファイルの所有者に関する仕様がファイルのパーミッション変更を妨げたり、DOS の仕様が読み取り専用ファイルの削除を妨げたりする問題を回避する。
既定値: delete readonly = no
directory mask このパラメーターは、パーミッションを示す8進数の数値であり、UNIX 側のディレクトリ作成時に DOS の属性から UNIX のパーミッションを生成する際に使われる。
ディレクトリ作成時に付与されるパーミッションは、DOS の属性と UNIX のパーミッションとのマッピングにしたがって、DOS の属性を UNIX のパーミッションに変換することにより生成されるが、最終的には、このパラメーターとビット単位の AND 演算が行なわれる。このパラメーターは、ディレクトリの UNIX のパーミッションに対するビットマスクと 考えることができる。ここで設定されないビットは、ディレクトリ作成時のパーミッションから削除される。
このパラメーターの既定値は、「group」と「other」の書き込み権を UNIX のパーミッションから取り除き、ディレクトリの所有者のみが変更可能にしたものである。
この処理に引き続いて、Samba はこのパラメーターで生成された UNIX のパーミッションと force directory mode パラメーターの値との OR 演算を行う。このパラメーターは既定では 000 に設定されている(つまり、追加されるパーミッションはない)。
このパラメーターは、Windows NT/2000 の ACL エディターで設定される アクセス許可には適用されない。ACL に対しても強制的にマスクを適用したい場合は、directory security mask パラメーターを設定することが必要である。
既定値: directory mask = 0755
directory security mask このパラメーターは、Windows NT クライアント上のセキュリティダイアログボックスを使って、UNIX ディレクトリのパーミッションを操作する時に、設定可能な UNIX 側のパーミッションを指定する。
このパラメーターは、変更されるパーミッションビットに対して、マスクとして適用され (AND 操作が適用され)るため、このマスクにないビットは変更操作から保護される。このパラメーターを、AND ではなく OR 操作を実行するパラメーターである force directory security mode と混同しないように。基本的に、マスク中で 0 と指定されたビットは、常時0であるビットと見なされる。
基本的に、このマスク中ですべてのビットを0に設定することは、ファイル上の、このビットの以前のステータスにかかわらず、ファイルのパーミッション上の 対応するビットを0に設定する結果となる。
このパラメーターが明示的に指定されなかった場合は、0777 に設定される。これにより、ディレクトリに対する全ての user/group/world パーミッションが変更可能となる。
注意 : 他の方法を使って Samba サーバーにアクセスすることが可能なユーザーは、この制限を簡単に回避できてしまう。そのため、このパラメーターの主な用途はスタンドアロンで動作する”アプライアンス” システムになるだろう。通常のシステムの管理者のほとんどは、このパラメーターを規定値の 0777 のままにしておきたいと考えるだろう。
既定値: directory security mask = 0777
display charset Samba がメッセージを標準出力や標準エラー出力に出力する際に 用いる文字コードセットを指定する。既定値は “LOCALE”であり、これは、ロケールに従い、自動的に設定される ことを意味する。この値は、通常、unix charset と同じに 設定すべきである。
既定値: display charset = “LOCALE” or “ASCII” (システムに依存)
例: display charset = UTF8
dont descend システムに存在するディレクトリには、クライアントに参照させたくないものや、無限に深い(再帰的)なものが存在する(たとえば Linux での /proc)。このパラメーターは常に空のように見せかけるサーバー側のディレクトリをコンマで区切って指定する。
Samba が要求する「dont descend」の書式は一定ではない。たとえば /proc ではなく ./proc でなければならないかもしれない。実験してみるのが最良の方法である。
既定値: dont descend =
例: dont descend = /proc,/dev
dos charset DOS SMB クライアントは、サーバー側でも自身と同じ文字コードセットを使用していると想定する。このオプションにより、Samba が DOS クライアントと通信する際に用いられる文字コードセットを指定する。
デフォルトは Samba にインストールされた文字コードセットによって異なる。Samba は、文字コードセット 850 の使用を試みるが、使用できない場合は ASCII を使用する。testparm(1) コマンドを実行することで、システム上の既定値を確認することが可能である。
既定値なし
例: dos charset = CP932
fstype このパラメーターは、クライアントが共有のファイルシステムを問い合わせた際に、smbd(8) が返却する共有のファイルシステム名を指定する。デフォルトは Windows NT 互換の NTFS だが、必要に応じて Samba や FAT といった別の文字列に、変更することができる。
既定値: fstype = NTFS
例: fstype = Samba
guest account このパラメーターは、guest ok (以下を参照のこと) が設定されたサービスにアクセスする際に使用されるユーザー名である。ゲストサービスに接続しているクライアントすべてに対して、ここで設定したユーザーの権限が適用される。このユーザーはパスワードファイルに存在している必要があるが、ログイン可能となっている必要はない。このパラメーターとして、「ftp」ユーザーを利用するのもよいであろう。
システムによっては、アカウント「nobody」では印刷することができない。この場合は別のアカウントを使用すること。ゲストユーザーでログイン(su -コマンドなどを使用する)して、lpr(1) や lp(1) などの、システムにある印刷コマンドを実行して印刷を行ってみることで、これを確認しておくべきであろう。
このパラメーターは % マクロを受け付けない。システムの大半の箇所では、正常動作する上でこの値が静的に設定されていることが必要とされるためである。
既定値: guest account = nobody # default can be changed at compile-time
例: guest account = ftp
guest ok このパラメーターが yes のサービスに付いては、サービスへの接続の際にパスワードが要求されない。この場合、guest account の権限で操作が行われる。
このパラメーターは restrict anonymous = 2 のメリットを無効にする。
既定値: guest ok = no
guest only このパラメーターが yes のサービスについては、ゲスト接続のみが許可される。このパラメーターは、guest ok が有効になっていないサービスでは無効である。
既定値: guest only = no
hide dot files この真偽値パラメーターにより、ドットで始まるファイル名のファイルを隠しファイルとして扱うかどうかが制御される。
既定値: hide dot files = yes
hide files これは、見せたくないがアクセスは許可したいファイルやディレクトリのリストを指定する。DOSの「隠し」属性が該当するファイルやディレクトリに付加される。リストの各エントリは、スペースをエントリ中に含められるようにするため、「/」で区切る必要がある。「*」と「?」は、DOSのワイルドカードと同様にして、複数のファイルやディレクトリを指定するために利用することができる。各エントリはUNIXのパス形式で指定すること。DOSのパス形式で指定したり、UNIXでディレクトリを意味する「/」を含んだりはできない。
この設定には、case sensitive オプションの設定が影響することに注意。
このパラメーターを設定すると、全てのファイルやディレクトリに対して該当するかどうかの確認を行う必要が発生するため、Samba のパフォーマンスに影響がでる。
以下の設定例は、Thursby から入手可能な Macintosh 上の SMB クライアント (DAVE) が内部的な用途に作成するファイルの指定に加え、ドットで始まるファイルを隠しファイルとして指定したものである。
このパラメーターの設定例を以下に示す。
既定値: hide files = # どのファイルも隠されない
例: hide files = /.*/DesktopFolderDB/TrashFor%m/resource.frk/
inherit acls このパラメーターは、親ディレクトリに既定値のACLが設定されており、サブディレクトリの作成時に、その ACL の設定を引き継がせたい場合に用いられる。既定値ではディレクトリ作成時に 設定されるモードが用いられる。このオプションを有効にすると、モードが 0777 となり、ディレクトリの既定値のACLを確実に継承できるようになる。ネイティブなWindowsデータをメタデータとして格納する、VFSモジュールacl_xattrか acl_tdbは、ロードされるどのような共有に対しても、WindowsのACLを正しく エミュレートするために、このオプションを自動的にオンにする事が要求される ことに注意。
既定値: inherit acls = no
inherit owner 新規作成したファイルやディレクトリの所有者としては、通常接続しているユーザーの実行 UID の値が用いられる。このパラメーターにより、Samba の管理者は、新規作成したファイルやディレクトリの所有者を 親ディレクトリの所有者と同一にすることが可能となる。
この動作が有用な状況としては、ユーザーがファイルの作成や修正はできるが、削除はできないようにした drop box や、あるユーザーの移動プロファイルのディレクトリ内に新規作成されたファイルの所有者が そのユーザーとなるようにしたい場合などが挙げられる。
既定値: inherit owner = no
inherit permissions 通常、新規作成したファイルやディレクトリのパーミッションは、 create mask 、directory mask 、 force create mode 、 force directory mode パラメーターによって決定されるが、 真偽値パラメーターである inherit permissions は、それらに優先される。
新しいディレクトリはsetgid のようなビットも含め、 親ディレクトリのパーミッションを引き継ぐようになる。
新しく作成されたファイルは、read/write ビットの設定を親ディレクトリから引き継ぐようになる。 execute ビットについては、従来どおり map archive 、 map hidden 、map system などにより制御される。
setuid ビットが引き継がれることは、決して ない(コード上で明示的に禁止している)。
このパラメーターは、数千人レベルの多くのユーザーが存在する大規模なシステムで、 単一の [homes] 共有を各ユーザーが柔軟に利用できるようにさせる際に、 特に有用であろう。
既定値: inherit permissions = no
invalid users これは、サービスに対するログインを許可しないユーザーのリストを指定する。このパラメーターは、不適切な設定により発生しうるセキュリティ上の問題を完全に抑止する、パラノイド的設定である。
「@」ではじまる名前は(システムがNISをサポートしている場合)、まずNISネットグループとして解釈され、NISネットグループデータベースに名前が存在しない 時は、UNIXのグループとして解釈される。
「+」で始まる名前は、NSS getgrnam() インタフェース経由でUNIXのグループ名として のみ解釈される。「 & 」で始まる名前は、NISネットグループの名前としてのみ解釈される (この場合システムでNISが稼働している必要がある)。名前の前に付けられた「+」および「 & 」文字は、検索の順番を示す意味で使うこともできる。例えば、+&groupは、UNIXグループを検索してから、NISネットグループを検索するという意味になり、&+groupは、NIS ネットグループを検索してから UNIXグループを検索するという意味になる(これは「@」と同等になる)。
%Sは、現在のサービス名に置換される。これは [homes] セクションで有効である。
既定値: invalid users = # invalid users は空である
例: invalid users = root fred admin @wheel
log level このパラメーターの値(整数値)により、smb.conf ファイル中でデバッグレベル(ログレベル)を設定することが可能になる。このパラメーターは Samba 2.2.x 系列と比べ強化されており、デバッグクラス毎にデバッグレベルを指定することが可能となっている。これにより、システムの設定が非常に柔軟に行なえるようになる。以下の デバッグクラスが現在実装されている。
all、tdb、printdrivers、lanman、smb、rpc_parse、rpc_srv、rpc_cli、passdb、sam、auth、winbind、vfs、idmap、quota、acls、locking、msdfs、dmapi、registry
既定値: log level = 0
例: log level = 3 passdb:5 auth:10 winbind:2
read list これは、サービスに対して読み取りアクセス許可のみを与えられたユーザーのリストである。接続したユーザーがこのリスト中に存在する場合、read only パラメーターの値がどのように設定されていても、書き込みアクセス許可は与えられない。リストには invalid users パラメーターの説明で記述した形式を使って、グループ名を含めることも可能である。
Samba 3.0 系列において、このパラメーターは security = share の環境で動作しない。これは仕様である。
既定値: read list =
例: read list = mary, @students
read only writeable の反意語である。
このパラメーターが yes の場合、ユーザーは、サービスのディレクトリ内におけるファイルの作成も修正もできない。
印刷サービス(printable = yes)の場合、ユーザーは常に(アクセス権を持っている) ディレクトリに対して書き込むことが可能であるが、書き込みはスプール操作経由に限られる。
既定値: read only = yes
unix charset Samba が動作する UNIX マシンで使われている文字コードを指定する。この情報は、Samba が SMB クライアントの使用している文字コードと文字列の変換を行なうために必要である。
ここで設定した文字コードは、Samba から実行するスクリプトの引数にも用いられる。
既定値: unix charset = UTF8
例: unix charset = ASCII
valid users サービスにアクセスできるユーザーのリストを指定する。’@’、’+’、’&’ からはじまる名前は、invalid users パラメーターで説明した規則にしたがって解釈される。
このパラメーターが設定されていない場合(既定値)、どのようなユーザーでもログインできる。このリストと invalid users の両方に含まれるユーザーのアクセスは拒否される。
%S は、現在のサービス名に置き換えられる。これは [homes] セクションで用いると便利である。
既定値: valid users = # No valid users list (anyone can login)
例: valid users = greg, @pcusers
veto files このパラメーターは、一覧することもアクセスすることもできないファイルとディレクトリのリストを指定する。リストの各エントリは ‘/’ で区切ること。これにより、エントリ中に空白文字を用いることが可能になっている。’*’と ‘?’は DOS のワイルドカードと同様、複数のファイルやディレクトリを指定するために利用できる。
各エントリはDOSの形式ではなく、UNIXでのパス形式である必要があり、UNIX のディレクトリ区切りである ‘/’を含めてはならない。
case sensitive オプションが、この処理に影響することに注意。
veto files パラメーターの利用に際して注意すべき重要な点が、ディレクトリ削除時の動作である。削除されるディレクトリに veto files パラメーターに一致するファイルが存在する場合、delete veto files パラメーターが yes でない限り、削除は失敗する。
このパラメーターを設定した場合は、ファイルやディレクトリの一覧を取得する際、すべてのファイルとディレクトリについて、このパラメーターのマッチング処理が行なわれるようになるため、Samba の性能に影響が発生する。
以下に設定例を記載する:
veto files = /*Security*/*.tmp/*root*/
veto files = /.AppleDouble/.bin/.AppleDesktop/Network Trash Folder/
既定値: veto files = アクセスできないファイルやディレクトリはない
vfs objects このパラメーターは、Samba の VFS I/O 操作において用いられるバックエンド名を指定する。デフォルトでは通常のディスク I/O 操作が行なわれるが、VFS オブジェクトによりこの操作を変更することが可能である。
既定値: vfs objects =
例: vfs objects = extd_audit recycle
writeable read only の反意語である。
既定値なし
write cache size この数値パラメーターを 0 以外に設定すると、Sambaは oplock された各ファイルに対してメモリキャッシュを作成するようになる (oplock されないファイルに対しては 行なわれない 。クライアントがディスクへの書き出しを直接要求していない書き込みは全て、可能な限りこのキャッシュに蓄積される。キャッシュはキャッシュに適さない位置からの書き込みが行なわれた時か、ファイルがクライアントによってクローズされた時に書き出される。データがキャッシュ中に存在していれば、ファイルからの読み出しにキャッシュが使用される。
Sambaは、このキャッシュにより、RAID ディスクに対して適切な書き込みサイズでクライアントからの書き込みを処理できるようになり (例えば、書き込みサイズをRAIDのストライプサイズに合わせる)、ディスクサブシステムがボトルネックとなっているが、ユーザー空間のプログラム向けの空きメモリがあるシステムのパフォーマンスを向上させることができる。
この数値パラメーターにより、(oplock を行なったファイル単位での) キャッシュサイズがバイト単位で指定される。
既定値: write cache size = 0
例: write cache size = 262144 # 1 ファイルあたり 256k のキャッシュサイズ
write list これは、サービスに対して読みとりおよび書き込み権が与えられるユーザーのリストである。接続したユーザーがこのリストに存在している場合は、例え read only オプションが no であっても書き込み権が与えられる。このリストには、@group という形式を用いることでグループ名を含めることもできる。
Samba 3.0 において、このパラメーターは security = share では動作しない。これは仕様である。
既定値: write list =
例: write list = admin, root, @staff

CentOS7+Samba4での無料ActiveDirectory構築

今回はプライマリとセカンダリの2台を構成する。

プライマリとセカンダリの共通設定

ホスト名の設定。それぞれ test-dc1 test-dc2 とする。

# hostnamectl set-hostname test-dc1

NTPサーバーにする。
※構築手順はこちらの記事を参照

必要なコンポーネントのインストールらしい。

yum -y install \
perl \
gcc \
libacl-devel \
libblkid-devel \
gnutls-devel \
readline-devel \
python-devel \
gdb \
pkgconfig \
krb5-workstation \
zlib-devel \
setroubleshoot-server \
libaio-devel \
setroubleshoot-plugins \
policycoreutils-python \
libsemanage-python \
setools-libs-python \
setools-libs \
popt-devel \
libpcap-devel \
sqlite-devel \
libidn-devel \
libxml2-devel \
libacl-devel \
libsepol-devel \
libattr-devel \
keyutils-libs-devel \
cyrus-sasl-devel \
cups-devel \
bind-utils \
libxslt \
docbook-style-xsl \
openldap-devel

最新版のSambaをダウンロードする。この記事を書いたときは4.6.5だった。

$ wget http://www.samba.org/samba/ftp/samba-latest.tar.gz

解凍してインストールする。

$ tar zxf samba-latest.tar.gz
$ cd samba-*
# ./configure; make; make install

ファイアウォールの例外を登録する。

# firewall-cmd --permanent --add-port=42/tcp
# firewall-cmd --permanent --add-port=53/tcp
# firewall-cmd --permanent --add-port=53/udp
# firewall-cmd --permanent --add-service=kerberos
# firewall-cmd --permanent --add-service=ntp
# firewall-cmd --permanent --add-port=135/tcp
# firewall-cmd --permanent --add-port=137/udp
# firewall-cmd --permanent --add-port=138/udp
# firewall-cmd --permanent --add-port=139/tcp
# firewall-cmd --permanent --add-service=ldap
# firewall-cmd --permanent --add-port=389/tcp
# firewall-cmd --permanent --add-port=389/udp
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --permanent --add-port=464/tcp
# firewall-cmd --permanent --add-port=464/udp
# firewall-cmd --permanent --add-service=ldaps
# firewall-cmd --permanent --add-port=1024-5000/tcp
# firewall-cmd --permanent --add-port=49152-65535/tcp
# firewall-cmd --permanent --add-port=5722/tcp
# firewall-cmd --permanent --add-port=9389/tcp
# firewall-cmd --reload

SELinuxの例外を登録する。

# setsebool -P samba_domain_controller true
# setsebool -P samba_export_all_ro true
# setsebool -P samba_export_all_rw true
# setsebool -P samba_enable_home_dirs true

systemdにsambaサービスを登録する。
/etc/systemd/system/samba.service を下記内容で作成。

[Unit]
Description= Samba 4 Active Directory
After=syslog.target
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/samba/var/run/samba.pid
ExecStart=/usr/local/samba/sbin/samba
[Install]
WantedBy=multi-user.target

プライマリの設定

ドメインをセットアップする。
※–use-rfc2307 (Linux/BSD/macOSを認証する場合は必須)
※–interactive (セットアップを対話式で行う)
※–function-level=2008_R2 (機能レベルを2008_R2に)

# /usr/local/samba/bin/samba-tool domain provision --use-rfc2307 --interactive --function-level=2008_R2

Realm: LOCAL.EXAMPLE.COM
Domain: EXAMPLE

下記のエラーが発生した場合は/etc/krb5.confの includedir /etc/krb5.conf.d/ をコメントアウトする。

ERROR(ldb): uncaught exception - operations error at ../source4/dsdb/samdb/ldb_modules/password_hash.c:2816

参照DNSを自身のIPアドレスにする。
dns-searchをRealmに変更する。

サービスを有効にして起動する。

# systemctl enable samba
# systemctl start samba

セカンダリの設定

参照DNSのプライマリをプライマリドメコンのIPアドレスにする。
dns-searchをRealmに変更する。

プライマリでkrb5.conf内をコメントアウトしている場合は同じく /etc/krb5.conf の includedir /etc/krb5.conf.d/ をコメントアウトする。

ドメコンとしてドメイン参加させる。

# samba-tool domain join example DC -U administrator --realm=LOCAL.EXAMPLE.COM

/usr/local/samba/etc/smb.confに下記を追記する。

dns forwarder = [プライマリと同じforwarder]
idmap_ldb:use rfc2307 = yes

参照DNSのセカンダリを本サーバーのIPアドレスにする。

サービスを有効にして起動する。

# systemctl enable samba
# systemctl start samba

グループポリシーが自動では同期されないので、グループポリシーの変更後はセカンダリにて下記コマンドを実行する必要がある。

# rsync -a -u -e ssh root@test-dc1:/usr/local/samba/var/locks/sysvol/ /usr/local/samba/var/locks/sysvol/
# /usr/local/samba/bin/samba-tool ntacl sysvolreset

その他

Windowsの管理ツールではパスワードやアカウントロックのポリシーが変更できなかった。samba-toolで直接変更する。

# /usr/local/samba/bin/samba-tool domain passwordsettings set --complexity=on
# /usr/local/samba/bin/samba-tool domain passwordsettings set --min-pwd-length=5
# /usr/local/samba/bin/samba-tool domain passwordsettings set --min-pwd-age=30
# /usr/local/samba/bin/samba-tool domain passwordsettings set --max-pwd-age=0
# /usr/local/samba/bin/samba-tool domain passwordsettings set --account-lockout-duration=60
# /usr/local/samba/bin/samba-tool domain passwordsettings set --account-lockout-threshold=3
# /usr/local/samba/bin/samba-tool domain passwordsettings set --reset-account-lockout-after=60
# /usr/local/samba/bin/samba-tool domain passwordsettings set --reset-account-lockout-after=60
# /usr/local/samba/bin/samba-tool domain passwordsettings set --history-length=5

DNSの更新状況の確認。
No DNS updates needed ならOKらしい。

# /usr/local/samba/sbin/samba_dnsupdate --verbose

FSMOの確認。

# /usr/local/samba/bin/samba-tool fsmo show

FSMOの移行。転送先サーバーで下記コマンドを実行する。

# /usr/local/samba/bin/samba-tool fsmo transfer --role all

CentOS7でNTPサーバーを構築

NTPをインストールする。

# yum -y install ntp

設定ファイルを変更する。

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

ファイアウォールに例外を追加する。

# firewall-cmd --add-service ntp --permanent
# firewall-cmd --reload

サービスの自動起動を有効にして起動もする。

# systemctl enable ntpd
# systemctl start ntpd

※補足
タイムゾーンをJSTに変更するには…

# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

CentOS7でDHCPサーバーを構築する

DHCPをインストールする。

# yum -y install dhcp

/etc/dhcp/dhcpd.confに下記を追記する。

option domain-name "local.example.com";
subnet 10.0.2.0 netmask 255.255.255.0 {
    range dynamic-bootp 10.0.2.110 10.0.2.119;
    option routers 10.0.2.2;
    option domain-name-servers 10.0.2.101,10.0.2.102;
    default-lease-time 288000;
    max-lease-time 576000;
}

ファイアウォールに例外を追加する。

# firewall-cmd --permanent --add-service=dhcp
# firewall-cmd --reload

サービスを有効にして起動する。

# systemctl enable dhcpd
# systemctl start dhcpd