Linux Systeembeheer/Bestanden en printers delen

Inleiding

bewerken

Tegenwoordig 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

bewerken

In 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
  • 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

bewerken

NFS 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

bewerken

De 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

bewerken

In 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

In 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

bewerken

Maak 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

bewerken

Samba 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

bewerken

De 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

In 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

bewerken

FTP staat voor File Transfer Protocol en maakt het mogelijk bestanden uit te wisselen over TCP/IP.

Installatie

bewerken

De opdrachtregels die verder volgen zijn getest op een minimale installatie van CentOS 5.5.

 $ yum install vsftpd

Configuratie

bewerken

Als 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

In 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

bewerken

Naast 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

bewerken

Tegenwoordig 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.

  1. Zet een NFS fileserver op met volgende eigenschappen:
    1. Het SELinux-niveau moet op Enforcing blijven
    2. De directory /var/shares/Public moet voor alle hosts uit het klasnetwerk leesbaar zijn
    3. De directory /var/shares/Public/upload moet voor alle hosts uit het klasnetwerk leesbaar én schrijfbaar zijn
    4. Test uit vanop een andere computer
  2. Zet op dezelfde machine een Samba fileserver op met volgende eigenschappen:
    1. Het SELinux-niveau moet op Enforcing blijven
    2. De directory /var/shares/Public moet voor alle hosts uit het lokale leesbaar zijn en inloggen is niet nodig (“gast-toegang”)
    3. De directory /shares/Public/upload moet voor alle hosts uit het lokale netwerk leesbaar zijn én schrijfbaar voor de gebruiker student (die moet inloggen)
    4. Test uit vanop een andere computer, zowel vanuit Windows als vanuit Linux. Probeer op een Linux client een gedeelde directory te mounten.
  3. Zet op dezelfde machine een FTP server op waar je als anonieme gebruiker de inhoud van /var/shares/Public kan zien.

Bibliografie

bewerken
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.