Linux Systeembeheer/Bestanden en printers delen
Inleiding
bewerkenTegenwoordig kan je voor weinig geld een netwerk-harde schijf (Network Attached Storage of NAS) kopen. Meestal draait op dit soort apparaten een vorm van Linux. Zelf een NAS bouwen is helemaal niet zo moeilijk.
Bij het maken van deze opdracht zijn enkele mensen op problemen gestoten die ze niet direct konden oplossen. Voor iedereen die met de gewone stappen niet tot het gewenste resultaat komen, staat er onderaan een alternatief pad om deze opdracht te vervullen. Dit is getest op CentOS, en zou volledig moeten werken.
Leerdoelen
bewerkenIn een Redhat-gebaseerd Linux-systeem:
- Een NFS-server kunnen opzetten
- basisconfiguratie /etc/exports
- permissies instellen
- hosts toelaten (in /etc/exports, hosts.allow/deny)
- op afstand een NFS-directory mounten
- basisconfiguratie /etc/exports
- Een Samba-server kunnen opzetten
- bestanden delen
- printer delen
- permissies instellen
- security = user/share/...
- wachtwoorden beheren
- verschillende manieren om een share vanuit de client aan te spreken (Windows explorer, Gnome Nautilus, smbclient, mounten)
- Een eenvoudige FTP-server kunnen opzetten
Bestanden delen, de UNIX-manier: NFS
bewerkenNFS staat voor Network File System en is een protocol dat oorspronkelijk ontwikkeld werd door Sun Microsystems in 1984. NFS maakt het mogelijk om bestanden op te vragen over het netwerk op dezelfde manier als men dit zou doen voor bestanden op de lokale schijf. De meest recente versie is NFSv4.
Installatie
bewerkenDe opdrachtregels die verder volgen zijn getest op een minimale installatie van CentOS 5.5.
We beginnen met de installatie van het pakket nfs-utils, wat meteen ook de nodige dependencies installeert zoals onder andere portmap en nfs-utils-lib.
$ yum install nfs-utils
Configuratie
bewerkenIn het bestand /etc/exports bepalen we welke map(pen) we met welke hosts willen delen. Een configuratieregel heeft volgende syntax:
- <export> <host1>(<options>) ... <hostN>(<options>)
Mogelijke opties zijn onder andere:
- ro/rw, async/sync, wdelay, all_squash, no_root_squash
De optie all_squash maakt dat gebruikers die verbinding maken met het NFS, de account en permissies van de nobody account krijgen. Met de optie no_root_squash kan het NFS benaderd worden als root gebruiker.
Als voorbeeld delen we de map /shares/Public met hosts op de netwerken 192.168.1.0/24 en 10.0.0.0/16. Uitsluitend in de map /shares/Public/upload mag het mogelijk zijn bestanden te schrijven naar het NFS.
$ vi /etc/exports /shares/Public 192.168.1.0/24(rw,sync,all_squash,fsid=0) 10.0.0.0/16(rw,sync,all_squash,fsid=0)
Met de optie fsid=0 vertellen we de server dat deze export de root van het NFS is. Bemerk ook dat we voor de optie rw kiezen, hoewel we hosts geen schrijfrechten gunnen. We doen dat omdat we aan de map upload wel schrijfrechten willen toevertrouwen. Een alternatief is twee configuratieregels te definiëren, een met ro en een met rw, maar dat garandeert geen probleemloos resultaat. Doordat we in het bestand exports al hosts definiëren, hoeven we geen gebruik te maken van de bestanden hosts.allow en hosts.deny.
Vervolgens maken we de te delen mappen aan en verlenen iedereen schrijfrechten op de map upload. We maken voor het voorbeeld ook enkele testbestanden aan.
$ mkdir -p /shares/Public/upload $ chmod 777 /shares/Public/upload $ for i in 0 1 2; do touch /shares/Public/file$i; done
Tenslotte stellen we de firewall in om NFS verkeer toe te laten.
$ system-config-securitylevel-tui Security Level: Enabled SELinux: Enforcing Klik op 'Customize' en vink 'NFS4' aan.
De configuratie is klaar. We starten de nodige services.
$ service portmap start $ service nfs start $ service nfslock start
Als we de services automatisch willen starten bij het opstarten van de server kunnen we het commando chkconfig gebruiken.
$ chkconfig --list $ chkconfig nfs on
Als het bestand /etc/exports gewijzigd wordt, kan de nieuwe configuratie gebruikt worden zonder de nfs service te herstarten met het exportfs commando.
$ exportfs -ra
Bemerk dat de poorten die NFS gebruikt standaard niet vastliggen. Controleren op welke poorten de services draaien kunnen we doen met rpcinfo.
$ rpcinfo -p
Testen
bewerkenIn het voorbeeld is het adres van de server 192.168.1.115.
1. Op de CentOS server zelf
$ mount -vt nfs4 192.168.1.115:/ /mnt $ ls /mnt file0 file1 file2 upload $ touch /mnt/writetest touch: cannot touch '/mnt/writetest': Permission denied # OK # $ touch /mnt/upload/writetest; ls /mnt/upload writetest # OK # $ umount /mnt
2. Op een CentOS client
$ yum install nfs-utils $ service portmap start $ service nfs start $ service nfslock start $ mount -vt nfs4 192.168.1.115:/ /mnt $ vi /mnt/upload/writetest blah :wq # OK # $ umount /mnt
3. Op een Debian/Ubuntu client
$ sudo apt-get install nfs-common $ sudo modprobe nfs $ sudo mount -vt nfs4 192.168.1.115:/ /mnt $ ls /mnt file0 file1 file2 upload $ umount /mnt
Alternatief met vaste poorten en hosts.allow/deny
bewerkenMaak eerst de nodige mappen aan.
$ mkdir /shares /shares/Public /shares/Public/upload $ chcon -R -t public_content_t /shares/Public $ chcon -R -t public_content_rw_t /shares/Public/upload
Nu gaan we het exportsbestand aanpassen om de nodige rechten op de shares in te stellen.
$ nano /etc/exports
Daarin voegen we volgende regels toe.
/shares/Public *(ro,sync,all_squash) /shares/Public/upload *(rw,all_squash)
De instellingen hieronder zijn van toepassing in het netwerklokaal, pas deze aan voor je eigen configuratie indien nodig. Eerst stellen we de server-host in.
$ echo ’10.0.3.250 server’ >> /etc/hosts
Vervolgens stellen we de hosts in die we willen toelaten tot de server.
$ nano /etc/hosts.allow portmap:10. : allow lockd: 10. : allow mountd: 10. : allow rquotad: 10. :allow statd: 10. : allow
Opmerking: Indien je gebruik maakt van notatie 10.*.*.*/255.0.0.0 kan dit volgende fout opleveren: "RPC: Program not registered". |
Tot slot stellen we de hosts in die geen toegang krijgen tot de server.
$ nano /etc/hosts.deny portmap:ALL lockd:ALL mountd:ALL rquotad:ALL statd:ALL
Omdat de poorten variabel zijn bij NFS, is het geen slecht idee om deze vast in te stellen, wat het configureren van de firewall daarna makkelijker maakt.
$ nano /etc/sysconfig/nfs RQUOTAD_PORT=9403 LOCKD_TCPPORT=8001 LOCKD_UDPPORT=8002 MOUNTD_PORT=9402 STATD_PORT=9401
Vervolgens voegen we de juiste poorten toe aan de firewall (/etc/sysconfig/iptables):
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp --dport 111 -j ACCEPT -A INPUT -p udp --dport 111 -j ACCEPT -A INPUT -p tcp --dport 2049 -j ACCEPT -A INPUT -p udp --dport 2049 -j ACCEPT -A INPUT -p tcp --dport 9401 -j ACCEPT -A INPUT -p udp --dport 9401 -j ACCEPT -A INPUT -p tcp --dport 9402 -j ACCEPT -A INPUT -p udp --dport 9402 -j ACCEPT -A INPUT -p tcp --dport 9403 -j ACCEPT -A INPUT -p udp --dport 9403 -j ACCEPT -A INPUT -p tcp --dport 8001 -j ACCEPT -A INPUT -p udp --dport 8002 -j ACCEPT
Als allerlaatste inspanning veranderen we nog de instellingen van SELinux.
$ setsebool -P nfs_export_all_rw on $ setsebool -P samba_share_nfs on
Nu dienen we juist nog de service te starten en deze ook automatisch te laten starten bij het booten van de server.
$ chkconfig --level 2345 nfs on $ service nfs start
Indien het starten van de service faalt ligt het probleem waarschijnlijk bij de portmap service die niet draait.
$ service portmap start # of $ service rpcbind start
Nu kunnen we de NFS testen door ze te mounten op een andere pc/client. We zullen proberen een bestand aan te maken.
$ mkdir /mnt/Public $ mkdir /mnt/upload $ mount 10.0.3.250:/home/shares/Public /mnt/Public $ mount 10.0.3.250:/home/shares/Public/upload /mnt/upload $ touch /mnt/Public/alleenlezen.txt (dit lukt niet aangezien ro) $ touch /mnt/upload/lezenenschrijven.txt (dit lukt wel aangezien rw)
Opmerking: Mount werkt niet altijd. Bij fout: mount.nfs : mount system call fail. Probeer mount -t nfs4 voor een beter resultaat. |
De client moet ook NFS ondersteunen, indien dit niet het geval is krijg je een error.
$ sudo mount server:/shares/Public /mnt/Public mount: wrong fs type, bad option, bad superblock on server:/shares/Public, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so
Je kan dit oplossen door:
$ sudo apt-get install nfs-common portmap # Ubuntu/Debian $ sudo yum -y install nfs-utils portmon # Fedora/CentOS
Toen ik deze stappen de eerste maal volgde werkte alles zonder problemen. Bij een tweede poging werd mijn /shares/Public/upload folder steeds als "read-only" gemount. Ik ging ervan uit dat ik iets verkeerd gedaan had de tweede maal maar blijkbaar zijn er nog mensen bij wie deze folder als read-only mount. Ik heb dit "opgelost" door eerst de folder te mounten op de host en dan op de VM de rechten van de folder te veranderen als volgt:
$ sudo chmod ugo+rw /shares/Public/upload
Ik betwijfel of dit DE oplossing is, maar het werkt.
Indien dit niet zou lukken kunnen we altijd controleren of alle poorten open staan via het commando op de client in te geven:
$ rpcinfo –p 10.0.3.250
Of op de server met:
$ rpcinfo -p
Als alternatief kan je ook netstat of nmap gebruiken:
$ netstat -ntl
Bestanden delen, de Windows-manier: Samba
bewerkenSamba is een open source softwarepakket dat gebruik maakt van het SMB protocol. De technologie wordt vooral gebruikt om UNIX-machines te laten communiceren met Windows-machines.
Installatie
bewerkenDe opdrachtregels die verder volgen zijn getest op een minimale installatie van CentOS 5.5.
$ yum install samba
Configuratie
bewerken$ vi /etc/samba/smb.conf [global] workgroup = WORKGROUP server string = Samba Server Version %v netbios name = Samba log file = /var/log/samba/%m.log # max 50KB per log file, then rotate max log size = 50 security = user encrypt passwords = true map to guest = bad user passdb backend = tdbsam [public] path = /shares/Public public = yes read only = yes printable = no write list = +student guest ok = yes
We wijzigen de security context van de map die we delen.
$ chcon -R -t samba_share_t /shares/Public
We maken een gebruiker student aan, en verlenen hem toegang tot de Samba share.
$ useradd student # lokale gebruiker op server aanmaken $ passwd student # wachtwoord voor gebruiker instellen $ smbpasswd -a student # samba wachtwoord voor gebruiker instellen
Tenslotte stellen we de firewall in met system-config-securitylevel-tui
$ system-config-securitylevel-tui Security Level: Enabled SELinux: Enforcing Klik op 'Customize' en vink 'Samba' aan.
De configuratie is klaar. We starten de service. We zorgen ook dat de service opstart bij het opstarten van de server.
$ service smb start $ chkconfig smb on
Testen
bewerkenIn het voorbeeld is het adres van de server 192.168.1.115.
1. Met Ubuntu 10.10
Places => Connect to Server => Windows Share
- Server: 192.168.1.115
- Share: public
- Username: (blanco = "guest" account)
Resultaat: De schijf wordt read-only aangekoppeld.
Places => Connect to Server => Windows Share
- Server: 192.168.1.115
- Share: public
- Username: student
Resultaat: We kunnen inloggen met het Samba wachtwoord van de gebruiker student. De map upload is zoals verwacht schrijfbaar.
2. Met Ubuntu 13.04
Bestanden => Bestanden (menu bovenaan) => Verbinden met serveradres 192.168.1.115
3. Met Windows 7
Ga in Windows Explorer naar de locatie \\192.168.1.115.
Een FTP-server opzetten
bewerkenFTP staat voor File Transfer Protocol en maakt het mogelijk bestanden uit te wisselen over TCP/IP.
Installatie
bewerkenDe opdrachtregels die verder volgen zijn getest op een minimale installatie van CentOS 5.5.
$ yum install vsftpd
Configuratie
bewerkenAls voorbeeld configureren we een FTP-server waar je als anonieme gebruiker de inhoud van /shares/Public kan zien.
- $ vi /etc/vsftpd/vsftpd.conf
- anonymous_enable=YES
- anon_root=/srv/shares/Public
- no_anon_password=YES
- local_root=/srv/shares
- chroot_local_user=YES uit commentaar halen
We stellen de firewall in met system-config-securitylevel-tui.
$ system-config-securitylevel-tui Security Level: Enabled SELinux: Enforcing Klik op 'Customize' en vink 'FTP' aan.
Naast het toelaten inkomende FTP verbindingen is het ook nodig enkele SELinux booleans te wijzigen, zodat de variabelen' effect heeft.
- setsebool -P ftp_home_dir on
- setsebool -P allow_ftpd_anon_write on
- setsebool -P allow_ftpd_full_access on
Nu moeten er ook nog wat rechten aangepast worden op de mappen:
- chown root:student /srv/shares/upload
- Sudo chmod 775 /srv/shares/public
- Sudo chkconfig vsftpd on
Het enige wat ons verder rest is de service te starten, alsook maken dat deze start bij het opstarten van de server.
$ service vsftpd start service iptables restart $ chkconfig vsftpd on
Testen
bewerkenIn het voorbeeld is het adres van de server 192.168.1.115.
De server testen kunnen we doen door met een FTP-client of webbrowser verbinding te maken met ftp://192.168.1.115/.
De firewall instellen
bewerkenNaast gebruik te maken van system-config-securitylevel(-tui) kan je de firewall uiteraard ook configureren met iptables.
Een overzicht van de iptables voor een NAS met NFS, Samba en FTP:
# Firewall configuration written by system-config-securitylevel # Manual customization of this file is not recommended. *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] #LOOPBACK INTERFACE -A INPUT -i lo -j ACCEPT #NFS CONFIG -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp --dport 111 -j ACCEPT -A INPUT -p udp --dport 111 -j ACCEPT -A INPUT -p tcp --dport 2049 -j ACCEPT -A INPUT -p udp --dport 2049 -j ACCEPT -A INPUT -p tcp --dport 9401 -j ACCEPT -A INPUT -p udp --dport 9401 -j ACCEPT -A INPUT -p tcp --dport 9402 -j ACCEPT -A INPUT -p udp --dport 9402 -j ACCEPT -A INPUT -p tcp --dport 9403 -j ACCEPT -A INPUT -p udp --dport 9403 -j ACCEPT -A INPUT -p tcp --dport 8001 -j ACCEPT -A INPUT -p tcp --dport 8002 -j ACCEPT #SAMBA -A INPUT -p udp --dport 137 -j ACCEPT -A INPUT -p udp --dport 138 -j ACCEPT -A INPUT -p tcp --dport 139 -j ACCEPT -A INPUT -p tcp --dport 445 -j ACCEPT #FTP -A INPUT -p tcp --dport 21 -j ACCEPT -A INPUT -p tcp --dport 20 -j ACCEPT # FTP server poorten voor toegang vanuit een browser (niet nodig voor FTP-clients) #-A INPUT -p tcp --dport 6400:65535 -j ACCEPT COMMIT
Labo-opdracht
bewerkenTegenwoordig kan je voor weinig geld een netwerk-harde schijf (Network Attached Storage of NAS) kopen. Meestal draait op dit soort apparaten een vorm van Linux. De bedoeling van dit labo is zelf zo'n NAS te bouwen.
- Zet een NFS fileserver op met volgende eigenschappen:
- Het SELinux-niveau moet op Enforcing blijven
- De directory /var/shares/Public moet voor alle hosts uit het klasnetwerk leesbaar zijn
- De directory /var/shares/Public/upload moet voor alle hosts uit het klasnetwerk leesbaar én schrijfbaar zijn
- Test uit vanop een andere computer
- Zet op dezelfde machine een Samba fileserver op met volgende eigenschappen:
- Het SELinux-niveau moet op Enforcing blijven
- De directory /var/shares/Public moet voor alle hosts uit het lokale leesbaar zijn en inloggen is niet nodig (“gast-toegang”)
- De directory /shares/Public/upload moet voor alle hosts uit het lokale netwerk leesbaar zijn én schrijfbaar voor de gebruiker student (die moet inloggen)
- Test uit vanop een andere computer, zowel vanuit Windows als vanuit Linux. Probeer op een Linux client een gedeelde directory te mounten.
- Zet op dezelfde machine een FTP server op waar je als anonieme gebruiker de inhoud van /var/shares/Public kan zien.