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