Voor een fileserver is FreeBSD het besturingssysteem bij uitstek, vanwege de uitstekende ZFS-support. In dit artikel zal ik uitleggen hoe je FreeBSD met Samba 4 koppelt aan een Active Directory-domein, zodat het mogelijk is om met het AD-account in te loggen op de shares en ACLs te gebruiken. Dit artikel is dus niet bedoeld voor als je Samba als Domain Controller wilt instellen. Ik ga ervan uit dat je op een andere machine een Domain Controller (Windows Server of Samba) hebt draaien. Ik zal in dit artikel ook niet te diep ingaan op de configuratie van ZFS, behalve voor dingen die relevant zijn voor deze Samba-setup. Ik start dus op het punt dat je FreeBSD geïnstalleerd hebt en al een ZFS-pool hebt draaien.

Voorconfiguratie

NTP

We beginnen vast met het goedzetten van NTP. Voor Kerberos is het nodig dat de clock van de domain controller en dit systeem gelijk staan. Bij een te grote clock skew zal de authenticatie mislukken. Daarom is het het beste om die domain controller aan te wijzen als NTP-server. Als ntpdate al geïnstalleerd staat, is er enkel nog een goede configuratie nodig in /etc/rc.conf. Zorg ervoor dat de regels er zo uit komen te zien:

ntpdate_enable="YES"
ntpdate_hosts="192.168.2.2"

Vervang hierbij 192.168.2.2 voor het IP-adres (of hostname) van je Domain Controller. Het is uiteraard ook mogelijk om zowel je Domain Controller als de fileserver tegen een andere (maar dezelfde) NTP-server te laten synchroniseren.

Hostname

Voor Kerberos is het ook nodig dat de hostname goed staat. In FreeBSD moet je dat op meerdere plekken aanpassen.

hostname fileserver.domain.local

Bewerk ook /etc/rc.conf:

hostname="fileserver.domain.local"

En /etc/hosts:

127.0.0.1        fileserver.domain.local

Samba 4, AD-integratie en Winbind

Dan is het nu tijd om Samba (we kiezen voor Samba 4) te installeren. Samba is een implementatie van het SMB/CIFS-protocol voor Unix en Linux. In ons geval hebben we Samba zowel nodig om de shares te hosten, als om de integratie met Active Directory te verzorgen.

Installatie van Samba

Installeren Samba 4:

cd /usr/ports/net/samba44
make install clean

De belangrijkste config file van Samba is /usr/local/etc/smb4.conf. Die gaan we nu aanpassen zodat de inhoud het volgende wordt:

[global]
        netbios name = fileserver
        server string = fileserver (Samba 4 on FreeBSD)
        workgroup = DOMAIN
        realm = DOMAIN.LOCAL
        security = ADS

        # Winbind
        idmap config * : range = 500-100000000
        idmap config * : backend = autorid
        template shell = /usr/local/bin/bash
        winbind use default domain = Yes
        winbind nested groups = Yes
        winbind enum users  = yes
        winbind enum groups = yes

        # VFS modules
        vfs objects  = shadow_copy2 zfsacl

        # ZFS snapshots integration with Windows Previous Versions
        shadow: snapdir = .zfs/snapshot
        shadow: sort = desc
        shadow: format = auto-%Y-%m-%d_%H.%M

        # ACLs
        ea support = yes
        read only = no
        store dos attributes = yes
        map archive = no
        map acl inherit = yes
        nfs4:mode    = special
        nfs4:acedup  = merge
        nfs4:chown   = yes

        # Performance
        aio read size = 16384

[shares]
        path = /Data/shares

Zoals valt te zien aan de bovenstaande config, zorgen we ervoor dat we NTFS ACLs uit Windows kunnen gebruiken met ZFS. Samba zorgt ervoor dat de NTFS ACLs worden vertaald naar NFS4 ACLs (die ZFS snapt). Hiervoor is de VFS-module zfsacl nodig. Verder willen we graag dat Windows de ZFS-snapshots herkent via de “Previous Versions”-functie. Hiervoor is shadow_copy2 nodig.

Enkele opmerkingen over gebruikte opties:

  • store dos attributes = yes
    Dit laat Samba de DOS-attributes (system, hidden, archive, read-only) opslaan in de extended attributes.
  • map acl inherit = yes
    Dit laat Samba de ‘inherit’ en ‘protected access’ ACL-flags opslaan in extended attributes. Is nodig voor de correcte afhandeling van het inheriten van ACLs.
  • map archive = no
    By default slaat Samba het DOS-attribute ‘archive’ op in de POSIX-permissies als de owner execute bit. Dit willen wij niet hebben, het moet in de extended attributes komen.
  • ea support = yes
    Schakel support voor extended attributes in.

Omdat Samba4 een eigen, ingebouwde implementatie van Kerberos heeft, is het niet meer nodig Heimdal te installeren. Ook /etc/krb5.conf kun je daarom met rust laten. Je kunt Samba nu aanzetten door in /etc/rc.conf het volgende te zetten:

samba_server_enable="YES"

Dan even Samba (her)starten:

service samba_server restart

Winbind

Het is straks de bedoeling dat deze server van de groepen en gebruikers uit AD gebruik kan maken. Daarom moeten we nsswitch dat vertellen. Open daarom /etc/nsswitch.conf en verander de regels group, hosts en passwd:

group: files winbind
hosts: files dns
passwd: files winbind

Dan is het tijd om het domein te joinen. Het commando

net ads info

zou al kloppende informatie over het domein moeten weergeven. Als dat niet zo is, is er iets verkeerd ingesteld (dubbel-check de realm in /usr/local/etc/smb4.conf).

Het domein joinen gaat zo:

net ads join -U Administrator

Je kunt verifiëren dat alles goed is gegaan met

net ads testjoin
Join is OK

Op dit moment zouden alle gebruikers en groepen uit AD ook lokaal beschikbaar moeten zijn. Dat is te zien met de volgende commando’s:

wbinfo -u

(zou AD-gebruikers moeten uitkakken)

wbinfo –g

(zou AD-groepen moeten uitkakken)

getent passwd

(zou alle gebruikers, inclusief die uit AD, moeten uitkakken)

getent group

(zou alle groepen, inclusief die uit AD, moeten uitkakken)

Als wbinfo de gewenste output geeft, maar getent niet, dan is er iets misgegaan in de configuratie van nsswitch.

ZFS ACLs

We hebben ZFS nog niet verteld hoe het met zijn ACLs moet omgaan.

zfs set aclmode=passthrough Data/shares
zfs set aclinherit=passthrough Data/shares

Deze opties bepalen hoe ZFS omgaat met de inheritance van ACEs en wat voor effect chmod heeft. PAM en proftpd

Om gebruikers te authentiseren tegen Winbind in andere software dan Samba, hebben we PAM (Pluggable Authentication Modules) nodig. De configuratie hiervan staat in de map /etc/pam.d/. Als FTP-server gebruiken we ProFTPd. Om AD-gebruikers te laten inloggen op FTP, passen we /etc/pam.d/ftp aan. Voeg de volgende regel toe na de regel van pam_opieaccess:

auth           sufficient     /usr/local/lib/pam_winbind.so

De volgorde is dus belangrijk.

Installeer dan ProFTPd:

cd /usr/ports/ftp/proftpd
make install clean

Zet het volgende in /usr/local/etc/proftpd.conf:

#
# For more information about Proftpd configuration
# see http://www.proftpd.org/
#
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use.  It establishes a single server
# and a single anonymous login.  It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.

ServerName                      "fileserver (ProFTPD @ FreeBSD)"
ServerType                      standalone
DefaultServer                   on
ScoreboardFile                  /var/run/proftpd/proftpd.scoreboard

# Port 21 is the standard FTP port.
Port                            21

# Use IPv6 support by default.
UseIPv6                         on

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                           022

# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances                    30
CommandBufferSize               512

# Set the user and group under which the server will run.
User                            nobody
Group                           nogroup

# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot                     /Data/shares/

# Normally, we want files to be overwriteable.
AllowOverwrite                  on

# Bar use of SITE CHMOD by default
<Limit SITE_CHMOD>
        DenyAll
</Limit>

# A basic anonymous configuration, no upload directories.  If you do not
# want anonymous users, simply delete this entire  section.
<Anonymous /Data/shares/Public>
        User                    nobody
        Group                   nobody

        # Limit the maximum number of anonymous logins
        MaxClients              10

        UserAlias               anonymous nobody

        # We want 'welcome.msg' displayed at login, and '.message' displayed
        # in each newly chdired directory.
        DisplayLogin            welcome.msg

        # Limit WRITE everywhere in the anonymous chroot
        <Limit WRITE>
                DenyAll
        </Limit>
</Anonymous>

# FTPS
<IfModule mod_dso.c>
        # If mod_tls was built as a shared/DSO module, load it
        LoadModule mod_tls.c
</IfModule>

<IfModule mod_tls.c>
        TLSEngine               on
        TLSLog                  /var/log/ftpd/tls.log
        TLSOptions              NoSessionReuseRequired

        TLSProtocol             TLSv1 TLSv1.1 TLSv1.2
        TLSCipherSuite          EECDH+aRSA+AES256:EDH+aRSA+AES256:@STRENGTH

        # Are clients required to use FTP over TLS when talking to this server?
        TLSRequired             off

        # Server's RSA certificate
        TLSRSACertificateFile   /etc/ssl/example.com.pem
        TLSRSACertificateKeyFile /etc/ssl/private/example.com.key
        TLSCertificateChainFile /etc/ssl/example.com_chained.pem

        # Authenticate clients that want to use FTP over TLS?
        TLSVerifyClient         off

        # Allow SSL/TLS renegotiations when the client requests them, but
        # do not force the renegotations.  Some clients do not support
        # SSL/TLS renegotiations; when mod_tls forces a renegotiation, these
        # clients will close the data connection, or there will be a timeout
        # on an idle data connection.
        TLSRenegotiate          none
</IfModule>

# PAM
AuthPAMConfig                   ftp
AuthOrder                       mod_auth_pam.c* mod_auth_unix.c
PersistentPasswd                off
RequireValidShell               off

# Passive mode
MasqueradeAddress               example.com
PassivePorts                    60000 60010

Met de bovenstaande config wordt anonymous FTP automatisch ge-chroot naar /Data/shares/Public als de user nobody, is FTPS ingeschakeld (maar niet verplicht) en staat Passive FTP aan op poorten 60000 tot 60010. Vergeet niet de example.com’s aan te passen naar je echter domein en de paden naar de certificaten juist in te stellen.

Zet weer de volgende regel in /etc/rc.conf:

proftpd_enable="YES"

En start de FTP-server met

service proftpd restart

Bronnen en meer leesvoer

Samba SMB.CONF(5)

Samba in domein hangen, (FreeBSD/ZFS-specifiek)

Allerlei Samba-tips

Samba met ZFS ACLs 1 2

ProFTPd