root@opentodo#

GNU/Linux and Unix notes

Samba4 as AD domain controller on Centos 6

With the last version of samba 4 comes with Active directory logon and administration protocols, including typical active directory support and full interoperability with Microsoft Active Directory servers. This is possible with the combination of a LDAP directory,  heimdal kerberos authentication, dynamic DNS server and the necessary remote procedure calls RPC.
For complete list of the new changes you can see the next url: http://wiki.samba.org/index.php/Samba4

samba_logo_4c

This post covers the initial installation and configuration of samba 4 as Active Directory domain controller, on Centos 6 using bind 9 as DNS backend and NTPD (4.2.6) server used by the clients.

- Change the hostname:

# vi /etc/sysconfig/network

HOSTNAME=centos-dc

- Disable selinux:

# vi /etc/sysconfig/selinux

SELINUX=disabled

# setenforce 0

- Install some dependencies:

# yum -y install gcc make wget python-devel gnutls-devel openssl-devel libacl-devel krb5-server krb5-libs krb5-workstation bind bind-libs bind-utils

- Download and compile samba4:

# wget http://ftp.samba.org/pub/samba/samba-4.0.0.tar.gz
# tar -xzvf samba-4.0.0.tar.gz
# cd samba-4.0.0/
# ./configure --enable-selftest
# make && make install

- Provisioning a new domain:

# /usr/local/samba/bin/samba-tool domain provision --realm=opentodo.net --domain=OPENTODO --adminpass 'P@ssw0rd' --server-role=dc --dns-backend=BIND9_DLZ

The dns backend BIND9_DLZ uses samba4 AD to store zone information

- Edit named configuration:

# rndc-confgen -a -r /dev/urandom

 

# vi /etc/named.conf

options {
listen-on port 53 { any; };
forwarders {192.168.1.8; };
allow-query { any; };
tkey-gssapi-keytab "/usr/local/samba/private/dns.keytab";
};
include "/usr/local/samba/private/named.conf";

- Edit resolv.conf:

# vi /etc/resolv.conf

nameserver 127.0.0.1
domain opentodo.net

- Edit kerberos server configuration:

# vi /etc/krb5.conf

[libdefaults]
default_realm = OPENTODO.NET
dns_lookup_realm = false
dns_lookup_kdc = true

- Download and install the last version of ntp (4.2.6 comes with ntp sign support):

# wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-4.2.6p5.tar.gz
# tar -xzvf ntp-4.2.6p5.tar.gz
# cd ntp-4.2.6p5
# ./configure --enable-ntp-signd
# make && make install

- Configuring NTP:

# vi /etc/ntp.conf

server 127.127.1.0
fudge 127.127.1.0 stratum 10
server 0.pool.ntp.org iburst prefer
server 1.pool.ntp.org iburst prefer
driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp
ntpsigndsocket /usr/local/samba/var/lib/ntp_signd/
restrict default kod nomodify notrap nopeer mssntp
restrict 127.0.0.1
restrict 0.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
restrict 1.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery

- Setting up the correct permissions:

# chown named:named /usr/local/samba/private/dns
# chown named:named /usr/local/samba/private/dns.keytab
# chmod 775 /usr/local/samba/private/dns

- Configuring samba init script:

# vi /etc/init.d/samba4

 

#! /bin/bash
#
# samba4 Bring up/down samba4 service
#
# chkconfig: - 90 10
# description: Activates/Deactivates all samba4 interfaces configured to
# start at boot time.
#
### BEGIN INIT INFO
# Provides:
# Should-Start:
# Short-Description: Bring up/down samba4
# Description: Bring up/down samba4
### END INIT INFO
# Source function library.
. /etc/init.d/functions

if [ -f /etc/sysconfig/samba4 ]; then
. /etc/sysconfig/samba4
fi

CWD=$(pwd)
prog="samba4"

start() {
# Attach irda device
echo -n $"Starting $prog: "
/usr/local/samba/sbin/samba
sleep 2
if ps ax | grep -v "grep" | grep -q /samba/sbin/samba ; then success $"samba4 startup"; else failure $"samba4 startup"; fi
echo
}
stop() {
# Stop service.
echo -n $"Shutting down $prog: "
killall samba
sleep 2
if ps ax | grep -v "grep" | grep -q /samba/sbin/samba ; then failure $"samba4 shutdown"; else success $"samba4 shutdown"; fi
echo
}
status() {
/usr/local/samba/sbin/samba --show-build
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status irattach
;;
restart|reload)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac

exit 0

 

# chmod 755 /etc/init.d/samba4

- Configuring ntp init script:

# vi /etc/init.d/ntp

 

#! /bin/bash
#
# ntp Bring up/down ntp service
#
#chkconfig: - 99 30
#description: Bring up/down ntp
#
### BEGIN INIT INFO
# Provides:
# Should-Start:
# Short-Description: Bring up/down ntp
# Description: Bring up/down ntp
### END INIT INFO
# Source function library.
. /etc/init.d/functions

CWD=$(pwd)
NTPD=/usr/local/bin/ntpd
prog="ntp"
start() {
# Attach irda device
echo -n $"Starting $prog: "
$NTPD -p /var/run/ntpd.pid
sleep 2
if ps ax | grep -v "grep" | grep -q $NTPD ; then success $"ntp startup"; else failure $"ntp startup"; fi
echo
}
stop() {
# Stop service.
echo -n $"Shutting down $prog: "
kill -9 `cat /var/run/ntpd.pid` > /dev/null 2>&1
sleep 2
if ps ax | grep -v "grep" | grep -q $NTPD ; then failure $"ntp shutdown"; else success $"ntp shutdown"; fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0

 

# chmod 755 /etc/init.d/ntp

- Start services:

# /etc/init.d/named start
# /etc/init.d/ntp start
# /etc/init.d/samba4 start

- Initialize services at boot time:

# chkconfig --levels 235 samba4 on
# chkconfig --levels 235 ntp on
# chkconfig --levels 235 named on

- Adding iptables rules:

# vi /etc/sysconfig/iptables

-A INPUT -m udp -p udp --dport 53 -m comment --comment "DNS" -j ACCEPT
-A INPUT -m udp -p udp --dport 123 -m comment --comment "NTP" -j ACCEPT
-A INPUT -m udp -p udp --dport 135 -m comment --comment "RPC UDP" -j ACCEPT
-A INPUT -m udp -p udp --dport 138 -m comment --comment "NetBIOS Netlogon and Browsing" -j ACCEPT
-A INPUT -m udp -p udp --dport 389 -m comment --comment "LDAP UDP" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 88 -m comment --comment "Kerberos" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 464 -m comment --comment "Kerberos Password Management" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -m comment --comment "NetBIOS Session" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -m comment --comment "SMB CIFS" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 389 -m comment --comment "LDAP TCP" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 636 -m comment --comment "LDAP SSL" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3268 -m comment --comment "LDAP Global Catalog" -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3269 -m comment --comment "LDAP Global Catalog SSL" -j ACCEPT

# service iptables restart

Sources

http://wiki.samba.org/index.php/Samba4/HOWTO

https://fedoraproject.org/w/index.php?title=Features/Samba4

- NTP init script and iptables rules edited by Marc (see the comments), Thanks!!

, ,

19 thoughts on “Samba4 as AD domain controller on Centos 6

  • Marc says:

    Thanks for your post! I found a few useful items while reading this article.

    When using the above script for NTP, I got the following when attempting `chkconfig –levels 235 ntp on`
    “service ntp does not support chkconfig”

    Little bit of hacking with the samba script allowed me to make a pretty and useful ntp startup script. The part that chkconfig looks for is this line:
    # chkconfig: – 55 10
    (I chose 55 as the start due to some searching on the interwebs)

    The above line allows chkconfig to create the proper symlinks for the start/stop locations in rc#.d.

    Here is the pretty startup script:

    ====START SCRIPT=====
    #! /bin/bash
    #
    # ntp Bring up/down ntp service
    #
    # chkconfig: – 55 10
    # description: Bring up/down ntp
    #
    ### BEGIN INIT INFO
    # Provides:
    # Should-Start:
    # Short-Description: Bring up/down ntp
    # Description: Bring up/down ntp
    ### END INIT INFO
    # Source function library.
    . /etc/init.d/functions

    CWD=$(pwd)
    NTPD=/usr/local/bin/ntpd
    prog=”ntp”
    start() {
    # Attach irda device
    echo -n $”Starting $prog: ”
    $NTPD -p /var/run/ntpd.pid
    sleep 2
    if ps ax | grep -v “grep” | grep -q $NTPD ; then success $”ntp startup”; else failure $”ntp startup”; fi
    echo
    }
    stop() {
    # Stop service.
    echo -n $”Shutting down $prog: ”
    kill -9 `cat /var/run/ntpd.pid` > /dev/null 2>&1
    sleep 2
    if ps ax | grep -v “grep” | grep -q $NTPD ; then failure $”ntp shutdown”; else success $”ntp shutdown”; fi
    echo
    }
    # See how we were called.
    case “$1″ in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart|reload)
    stop
    start
    ;;
    *)
    echo $”Usage: $0 {start|stop|restart}”
    exit 1
    esac
    exit 0
    =====END SCRIPT=====

    As for iptables, I like to have comments for what the ports are:

    =====START IPTABLES=====
    -A INPUT -m udp -p udp –dport 53 -m comment –comment “DNS” -j ACCEPT
    -A INPUT -m udp -p udp –dport 123 -m comment –comment “NTP” -j ACCEPT
    -A INPUT -m udp -p udp –dport 135 -m comment –comment “RPC UDP” -j ACCEPT
    -A INPUT -m udp -p udp –dport 138 -m comment –comment “NetBIOS Netlogon and Browsing” -j ACCEPT
    -A INPUT -m udp -p udp –dport 389 -m comment –comment “LDAP UDP” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 88 -m comment –comment “Kerberos” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 464 -m comment –comment “Kerberos Password Management” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 139 -m comment –comment “NetBIOS Session” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 445 -m comment –comment “SMB CIFS” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 389 -m comment –comment “LDAP TCP” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 636 -m comment –comment “LDAP SSL” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 3268 -m comment –comment “LDAP Global Catalog” -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 3269 -m comment –comment “LDAP Global Catalog SSL” -j ACCEPT
    =====END IPTABLES=====

    Good luck to you on this, and I again thank you for the posting, as it got me pointed in the right direction :)

  • First of all Very Thanks Marc for your correction!! The init script for ntp was incomplete and your script is more solid than mine, I edited the post to include your script. I also include your iptables rules commented very important to clarify the ports that we have opened! Very useful the chkconfig documented in the man page: http://linux.about.com/library/cmd/blcmdl8_chkconfig.htm
    Thanks a lot for your time and do this post more consistent to help another people!!!

  • mikE says:

    congratulations on the script! I have a doubt boys!
      in – Edit named configuration:

    forwarders {192.168.1.8; };
    ..
    The ip “192.168.1.8″ is my GATEWAY??
    or should ip the my CentOS?

    sorry for bad english! i am brazilian! ;]

  • ChrisG says:

    Very nice and thorough tutorial, but seem to be having a problem with bind, just wondering if anyone has seen this before. After bind is all sorted out it fails to load with the error message: samba_dlz: Failed to connect to /usr/local/samba/private/dns/sam.ldb. Any help would be much appreciated!

    • Thanks Chris!! which version of bind are you using? You can see the version executing named -v

      • Chrisg says:

        I believe I was using 9.8.2, can’t get any more detailed than that I am afraid, I did not manage to solve this problem but did find a way around that worked perfectly, not meaning to detract from your tutorial but for those with the same problem as me, I used the samba interior dns server and this tutorial: alexwyn.com/computer-tips/centos-samba4-active-directory-domain-controller.

        Regardless of me using a different route, you have written a very easy to follow tutorial that did help me a lot. The only flaw I can think of is you don’t make it clear to ensure selinux is off before continuing, restarting at that point or using setenforce -permissive (guessing that command from memory) will do the trick.

        Cheers
        Chris

  • Thomas says:

    You can use this chunk of script (just copy & paste it) to download, build and install ntp RPMS from source. With this there is no need to create an ntp init script as it’s included with the RPM.

    # Install NTP >root4.2.6
    yum -y remove ntp ntpdate
    yum -y install libcap-devel openssl-devel libedit-devel wget
    mkdir -p ~/install_files/ntp
    cd ~/install_files/ntp
    wget http://vault.centos.org/6.3/os/Source/SPackages/ntp-4.2.4p8-2.el6.centos.src.rpm
    rpm -i ntp-4.2.4p8-2.el6.centos.src.rpm
    cd ~/rpmbuild/SOURCES
    wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-4.2.6p5.tar.gz
    cd ~/rpmbuild/SPECS
    cp ntp.spec ntp.spec.bak
    sed -i ‘s/Version: 4.2.4p8/Version: 4.2.6p5/g’ ntp.spec
    sed -i ‘s/–enable-linuxcaps/–enable-linuxcaps –enable-ntp-signd/g’ ntp.spec
    sed -i ‘s/%patch/#%patch/g’ ntp.spec
    sed -i ‘s/%{_sbindir}/tickadj/%{_sbindir}/tickadjn%{_sbindir}/sntp/g’ ntp.spec
    rpmbuild -ba ntp.spec
    cd ~/rpmbuild/RPMS/$(uname -p)/
    rpm -i ntp-4.2.6p5-2.el6.$(uname -p).rpm ntpdate-4.2.6p5-2.el6.$(uname -p).rpm

  • Nerd Runner says:

    Hi, I can’t start up the named service:

    [root@ad bind9]# service named start
    Starting named: [FAILED]

    Here’s my messages log:

    Mar 26 21:56:14 localhost named[3618]: Loading ‘AD DNS Zone’ using driver dlopen
    Mar 26 21:56:14 localhost named[3618]: dlz_dlopen failed to open library ‘/usr/local/samba/lib/bind9/dlz_bind9.so’ – /usr/local/samba/lib/bind9/dlz_bind9.so: failed to map segment from shared object: Permission denied
    Mar 26 21:56:14 localhost named[3618]: dlz_dlopen of ‘AD DNS Zone’ failed
    Mar 26 21:56:14 localhost named[3618]: SDLZ driver failed to load.
    Mar 26 21:56:14 localhost named[3618]: DLZ driver failed to load.
    Mar 26 21:56:14 localhost named[3618]: loading configuration: failure
    Mar 26 21:56:14 localhost named[3618]: exiting (due to fatal error)
    [root@ad bind9]#

    I’m using CentOS6.4. How can I fix this?

    Thanks!

  • kapil says:

    Very thankful for your tutorial its useful for me. I did it without any problem in Centos6.
    And successfully added windows clients to SAMBA4.

    I am unable to add linux SAMBA client to SAMBA4.

    Can you provide doc for adding domain member for Linux clients. I tried but failed.

    Thanks in advance.. Kapil

    • ivanmp91 says:

      Thank you Kapil!! You can try with likewise-open, I used it to authenticate Linux clients to AD servers.

  • powertoaster says:

    You need to rename /etc/init.d/samba to /etc/init.d/samba4 otherwise the killall samba command in the stop section of the init script will also kill the utility script and give an error when stoping or restarting the samba service.

    A very well written todo, thank you.

  • George says:

    Please am much more in love with Linux and i really need help on this samba4 Domain controller thing..I want to master it will your tutorials really helps but can i get it in a pdf form cuz is not always that am on the internet…i will be very grateful and if i could get other tutorials on other types of Linux servers like i would be much more grateful…keep up with your good work and may God richly Bless U….George from Ghana…!!!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

Follow

Get every new post delivered to your Inbox

Join other followers: