Sunday, October 24, 2010

FreeBSD Samba Domain Controller!

Εδώ και αρκετό καιρό είχα αποφασίσει να ξεφορτωθώ το Windows 2003 Server του δεύτερου σχολικού μας εργαστηρίου. Ο λόγος αρκετά απλός: είναι ένα μηχάνημα με οθόνη, πληκτρολόγιο το οποίο αν και παρέχει τις υπηρεσίες του στο δίκτυο των Windows του εργαστηρίου χρησιμοποιείται επίσης και ως κανονικός σταθμός εργασίας, συνήθως από τον όποιο καθηγητή διδάσκει, με όλα τα προβλήματα που συνεπάγεται κάτι τέτοιο.


Το συγκεκριμένο εργαστήριο είχε και ένα debian server σε εντελώς γυμνή μορφή (motherboard, τροφοδοτικό, δίσκος μέσα στο rack με τα δικτυακά). Το συγκεκριμένο μηχάνημα εξυπηρετούσε το debian το οποίο ήταν dual boot στο εργαστήριο, ως NIS/NFS server. Με την φετινή επανεγκατάσταση του εργαστηρίου, τα μηχανήματα δεν είναι πλέον dual boot (αν και έχει μείνει χώρος στους δίσκους αν θελήσουμε να το κάνουμε αργότερα). Όλα τα μαθήματα που σχετίζονται με *NIX διδάσκονται στο FreeBSD XDMCP εργαστήριο μας. Το μηχάνημα αυτό λοιπόν περισσεύει και θα μπορούσε να γίνει άριστος Domain Controller.


Θα μπορούσα φυσικά να εγκαταστήσω τον (αγορασμένο) Windows 2003 Server σε αυτό το μηχάνημα, αλλά γιατί; Σκέφτηκα ότι δεν έχει κάτι ιδιαίτερο να μου προσφέρει: το μόνο που χρειάζομαι είναι SMB file sharing, Domain login και roaming profiles. Κάτι το οποίο μπορεί να γίνει με το γνωστό μας Samba. Διαβάστε λοιπόν πως να κάνετε το FreeBSD Server σας Windows Domain Controller!



Εγκατάσταση Samba


Πολύ απλή ιστορία: Απλά εγκαταστήστε το port net/samba34. Χρησιμοποίησα τις παρακάτω επιλογές κατά τη μεταγλώττιση (επιλογή στο διάλογο config που εμφανίζεται):

WITHOUT_LDAP=true
WITHOUT_ADS=true
WITHOUT_CUPS=true
WITH_WINBIND=true
WITHOUT_SWAT=true
WITHOUT_ACL_SUPPORT=true
WITHOUT_AIO_SUPPORT=true
WITHOUT_FAM_SUPPORT=true
WITHOUT_SYSLOG=true
WITHOUT_QUOTAS=true
WITHOUT_UTMP=true
WITHOUT_PAM_SMBPASS=true
WITHOUT_DNSUPDATE=true
WITHOUT_AVAHI=true
WITHOUT_EXP_MODULES=true
WITH_POPT=true
WITHOUT_MAX_DEBUG=true
WITHOUT_SMBTORTURE=true


Δεν έχω ανάγκη για LDAP και ούτε για CUPS καθώς το εργαστήριο δεν έχει εκτυπωτή. Αντίθετα ενεργοποίησα το Winbind (WINS server) γιατί σε προηγούμενες εμπειρίες μου με αντίστοιχα πειράματα είχα προβλήματα όταν έλειπε. Με την εγκατάσταση του Samba server χρειάζεται να προσθέσουμε στο /etc/rc.conf:

samba_enable="YES"
winbindd_enable="YES"


Ένα απλό αρχείο για το configuration είναι το παρακάτω. Αποθηκεύστε το στο /usr/local/etc/smb.conf:

#======================= Global Settings =====================================
[global]
workgroup = THEDOMAIN
server string = THESERVER (SMB)
security = user
log file = /var/log/samba34/log.%m
max log size = 50
passdb backend = tdbsam
os level = 35
domain master = yes
preferred master = yes
domain logons = yes
logon path = \\%L\Profiles\%U
logon drive = H:
wins support = yes


#============================ Share Definitions ==============================
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S
map hidden = yes
create mask = 0755

[netlogon]
comment = Network Logon Service
path = /usr/local/samba/lib/netlogon
guest ok = yes
admin users = root, sonic
writable = no

[Profiles]
path = /usr/local/samba/profiles
read only = no
browseable = no
guest ok = yes


Ξεκινήστε την υπηρεσία δίνοντας:

# /usr/local/etc/rc.d/samba start


Δημιουργία Χρηστών


Για να προσθέσετε ένα χρήστη στο Samba server, θα πρέπει να διαθέτει UNIX account. Χρησιμοποιήστε το adduser script (ή την pw αν προτιμάτε) για να προσθέσετε έναν. Στο παράδειγμα μας, έστω ότι έχουμε προσθέσει το χρήστη student. Μπορείτε να του δώσετε ως shell το nologin. Για να τον προσθέσετε στο Samba server, δώστε:

# pdbedit -a -u student


Προσθέστε το χρήστη root καθώς και το δικό σας λογαριασμό στο Samba server:

# pdbedit -a -u root
# pdbedit -a -u sonic


Για όλους αυτούς τους λογαριασμούς θα χρειαστεί να δώσετε password. Δεν είναι απαραίτητο να είναι ίδιος με το UNIX password.

Δημιουργήστε ένα group ntadmins στο οποίο θα βάλετε το δικό σας account και το root. Έτσι θα μπορείτε να διαχειρίζεστε ως domain admin τα μηχανήματα. Δημιουργήστε επίσης ένα group users στο οποίο θα προσθέσετε όλους τους απλούς χρήστες των windows. Μπορείτε να χρησιμοποιήσετε την εντολή pw ή το sysinstall για να προσθέσετε αυτά τα groups εύκολα. Αμέσως μετά:

# pw groupmod ntadmins -m sonic,root
# pw groupmod users -m student


Και τώρα το σημαντικό: Θα πρέπει το group ntadmins να αντιστοιχισθεί στους Domain Admins του Windows network. Αντίστοιχα, θα πρέπει να γίνει αντιστοίχιση του group users στους Domain Users:

# net groupmap add ntgroup="Domain Admins" unixgroup=ntadmins rid=512 type=d
# net groupmap add ntgroup="Domain Users" unixgroup=users rid=513 type=d


Τέλος, δημιουργήστε τους καταλόγους που απαιτούνται για τα logon scripts και τα profiles των χρηστών:

# mkdir -p /usr/local/samba/lib/netlogon/scripts
# mkdir -p /usr/local/samba/profiles


Δημιουργία Λογαριασμών Μηχανημάτων


Δημιουργήστε το group machines μέσω του pw ή του sysinstall. Θα πρέπει να δημιουργήσετε ένα λογαριασμό για κάθε μηχάνημα που θα ανήκει στο domain. Παρακάτω δείχνουμε ένα παράδειγμα μέσω του adduser, όπου προσθέτουμε το μηχάνημα PC1:

# adduser

Username: PC1$
Full name: Workstation 1
Uid (Leave empty for default):
Login group [PC1$]: machines
Login group is machines. Invite PC1$ into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash rbash nologin) [sh]: nologin
Home directory [/home/PC1$]: /dev/null
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username : PC1$
Password :
Full Name : Workstation 1
Uid : 2038
Class :
Groups : machines
Home : /dev/null
Home Mode :
Shell : /usr/sbin/nologin
Locked : no
OK? (yes/no): yes


Καθώς βλέπετε, στο λογαριασμό του μηχανήματος πρέπει να προσθέσουμε στο όνομα ένα $. Έπειτα προσθέτουμε το λογαριασμό αυτό στη βάση δεδομένων του Samba server, αλλά εδώ χωρίς το $:

# pdbedit -a -m PC1


Τελικές ρυθμίσεις


Στον κατάλογο profiles, δημιουργήστε τον κατάλογο που θα αποθηκεύσει τις ρυθμίσεις του λογαριασμού student:

# mkdir -p /usr/local/samba/profiles/student
# chown -R student:users /usr/local/samba/profiles/student


Στο μηχάνημα Windows (PC1 στο παράδειγμα μας), κάντε login ως τοπικός administrator και χρησιμοποιήστε την τυπική διαδικασία για να δηλώσετε το μηχάνημα ως μέλος του domain. Συνίσταται επίσης να ενεργοποιήσετε το Wins resolution από τις ρυθμίσεις δικτύου και να δηλώσετε ως wins server το IP του server σας. Μια καλή ιδέα είναι επίσης να ενεργοποιήσετε το DNS και να ρυθμίσετε το FreeBSD σας και ως DNS server.

Μετά την επιτυχή είσοδο του μηχανήματος στο domain, κάντε login ως student. Το προφίλ του λογαριασμού θα αποθηκευθεί στο /usr/local/samba/profiles/student. Μετά την επιτυχή πρώτη είσοδο και ρύθμιση του προφίλ, μπορείτε να το κλειδώσετε αν θέλετε (mandatory profile):

# cd /usr/local/samba/profiles/student
# mv NTUSER.DAT NTUSER.MAN


Χρησιμοποιήστε την ίδια διαδικασία για να προσθέσετε όσα άλλα μηχανήματα και χρήστες χρειάζεστε. Συγχαρητήρια, έχετε ένα Windows Domain Controller χωρίς ιούς! Τυχαίο;

Saturday, October 23, 2010

Σειριακό Τερματικό και Σειριακή Κονσόλα στο FreeBSD


Ίσως με πείτε και αναχρονιστικό, αλλά είχα πολλά χρόνια να ασχοληθώ με σειριακές επικοινωνίες! Θα μου πείτε ποιος χρειάζεται σήμερα σειριακά τερματικά; Ακόμα και αν έχουμε headless μηχανήματα υπάρχει πάντα η δυνατότητα του ssh. Βέβαια μια κανονική σειριακή κονσόλα - και όχι απλό τερματικό - μας δίνει τη δυνατότητα να έχουμε όλα τα μυνήματα ήδη από την εκκίνηση του μηχανήματος καθώς και single user mode. Έτσι μπορούμε πραγματικά να αποσυνδέσουμε το πληκτρολόγιο και οθόνη από το server μας γνωρίζοντας ότι μπορούμε να κάνουμε τα πάντα από την σειριακή κονσόλα.

Ωστόσο το παραπάνω μίνι project είχε στη δική μας περίπτωση ένα άλλο πιο προφανή σκοπό: καθώς τα σειριακά ή "κουτά" τερματικά αναφέρονται ήδη στην ύλη του μαθήματος "Δίκτυα Υπολογιστών" των ΕΠΑΛ, είναι μια καλή ευκαιρία να δουν και οι μαθητές πως λειτουργεί στην πράξη κάτι τέτοιο και τι δυνατότητες και περιορισμούς έχει. Όπως βλέπετε και στη φωτογραφία, εγκαταστήσαμε το τερματικό μας σε μια γωνιά του Εργαστηρίου (το οποίο είναι ήδη βασισμένο σε FreeBSD) και αναρτήσαμε και μια αρκετά καλή περιγραφή για το τι είναι και πως λειτουργεί. Και φυσικά κάθε μαθητής μπορεί να το δοκιμάσει μόνος του!


Σειριακό Τερματικό


Είναι αρκετά απλό στην πραγματικότητα. Χρειάζεται το κεντρικό σας μηχάνημα να διαθέτει σειριακή θύρα. Σε πολλά καινούρια μηχανήματα η θύρα αυτή απουσιάζει. Ρίξτε ωστόσο μια ματιά στην μητρική: είναι αρκετά πιθανό να διαθέτει κάποιο header στο οποίο να μπορεί να συνδεθεί η αντίστοιχη καλωδιοταινία που καταλήγει στο γνωστό μας βύσμα DB9 (που στην πραγματικότητα λέγεται DE9). Για τερματικό μπορείτε να χρησιμοποιήσετε πρακτικά ένα οσοδήποτε παλιό μηχάνημα: στην πιο απλή περίπτωση, μπορείτε σε αυτό να εκτελέσετε το παλιό (κακό) DOS - ακόμα και από δισκέτα - και ένα πρόγραμμα σειριακής επικοινωνίας / εξομοίωσης τερματικου. Στη δική μας περίπτωση κάναμε ακριβώς αυτό: χρησιμοποιήσαμε το telix, πρόγραμμα για DOS. Το μηχάνημα που χρησιμοποιήσαμε για τερματικό είναι ένα Pentium 200Mhz (αρκετά ισχυρό για αυτή τη χρήση!) αλλά εύκολα μπορείτε να βάλετε ακόμα και... 8088. Φτιάξαμε ένα συνηθισμένο καλώδιο τύπου null modem και ακολουθήσαμε τις απλές οδηγίες στο FreeBSD Handbook:

http://www.freebsd.org/doc/el/books/handbook/term.html

Για μια απλή σειριακή κονσόλα, το μόνο που χρειάζεται είναι η παρακάτω γραμμή στο /etc/ttys:

ttyu0    "/usr/libexec/getty std.115200"    vt100    on  secure


Αν είστε λίγο παρανοικός ίσως θέλετε να μετατρέψετε το "secure" σε "insecure" ώστε να μην επιτρέπεται το root login μέσω της σειριακής ;)

Προσέξτε ότι σε FreeBSD 8.x η πρώτη σειριακή θύρα (η γνωστή μας COM1) θα είναι ttyu0 ενώ σε 7.χ θα είναι ttyd0. To 115200 δίνει την ταχύτητα της σύνδεσης. Αν χρησιμοποιείτε ένα πραγματικά παλιό μηχάνημα σαν τερματικό το πιθανότερο είναι να μην μπορέσετε να ανεβείτε τόσο ψηλά και να πρέπει να περιοριστείτε στα 9600 bps. Αμέσως μετά, το μόνο που χρειάζεται να κάνετε είναι:

# kill -HUP 1

ώστε η init να ξαναδιαβάσει το /etc/ttys και να ξεκινήσει η getty να εκτελείται στη σειριακή θύρα. Από τη μεριά του τερματικού, έχοντας συνδέσει το σειριακό καλώδιο μπορούμε να ρυθμίσουμε την επικοινωνία μας:

Ταχύτητα: 115200 (ή όσο βάλαμε στη γραμμή παραπάνω)
Data bits: 8
Parity: None
Stop bits: 1

το γνωστό δηλ. στους παλιούς 115200,8,Ν,1 ;) Η ρύθμιση γίνεται στο πρόγραμμα σειριακής επικοινωνίας που έχουμε εγκαταστήσει. Αν για κάποιο λόγο τρέχετε Windows (περαστικά σας) μπορείτε να χρησιμοποιήσετε το hyperterminal.

Αν όλα είναι καλά, θα δούμε αμέσως την προτροπή login στο τερματικό μας και μπορούμε να συνδεθούμε και να το χρησιμοποιήσουμε κανονικά.

Σειριακή Κονσόλα



Η παραπάνω διαδικασία είναι πράγματι απλή, αλλά δεν μας επιτρέπει να δούμε τα μυνήματα εκκίνησης ή να ξεκινήσουμε το μηχάνημα σε single user mode, καθώς ενεργοποιείται μόνο μετά που το σύστημα φτάσει σε πλήρη λειτουργία. Για να το επιτύχουμε αυτό, πρέπει να ενεργοποιήσουμε την σειριακή κονσόλα:

http://www.freebsd.org/doc/el/books/handbook/serialconsole-setup.html

Η διαδικασία γίνεται προσθέτοντας τις παρακάτω γραμμές στο αρχείο /boot/loader.conf:

boot_multicons="YES"
boot_serial="YES"
comconsole_speed="115200"
console="comconsole,vidconsole"


Με αυτές τις επιλογές ενεργοποιείται ταυτόχρονα τόσο η σειριακή όσο και η κανονική κονσόλα (multicons), στο επόμενο boot φυσικά. Προσέξτε την επιλογή comconsole_speed που καθορίζει προσαρμοσμένη ταχύτητα 115200. Αν δεν τη βάλετε, η ταχύτητα σας θα μείνει στην προεπιλεγμένη των 9600 bps.

Βέβαια και εμείς που τη βάλαμε δεν έγινε τίποτα: Η σειριακή κονσόλα πεισματικά παρέμεινε στα 9600 bps. Δοκιμάσαμε και με FreeBSD 7.X για να σιγουρευτούμε ότι δεν πρόκειται για κάποιο bug/feature του 8.X, αλλά δεν άλλαξε τίποτα. Τελικά καταλήξαμε στην εναλλακτική λύση που περιγράφεται στο Handbook, δηλ. την επαναμεταγλώττιση και εγκατάσταση των boot blocks:

# cd /usr/src/sys/boot/
# make clean
# make BOOT_COMCONSOLE_SPEED=115200
# make install


Μετά από αυτό, το serial console λειτούργησε υπέροχα στα 115200 bps. Μπορείτε να δείτε το ταυτόχρονο boot (vidconsole,comconsole) στο δοκιμαστικό μηχάνημα μου:


Saturday, July 3, 2010

Dual Boot Win7 + FreeBSD και χαζοί περιορισμοί της MS

Όχι δεν αλλαξοπίστησα για τα Windows 7! Απλώς θα χρειαστώ ένα μηχάνημα σχετικά φορητό αυτές τις μέρες για να καθαρίσω μερικούς ιούς από άλλα μηχανήματα (συνδέοντας πάνω τους δίσκους τους). Έχω ένα ωραίο atom σε mini-itx κουτί, το οποίο πραγματικά περισσεύει και έτσι είναι για πειράματα και τέτοιους είδους εργασίες. Χωράει άνετα στο backpack μου και μεταφέρεται παντού.
Το μηχάνημα αυτό είχε μέχρι στιγμής FreeBSD (τι παράξενο...) και αποφάσισα ότι είναι το κατάλληλο να βάλω windows για τον παραπάνω σκοπό.

Ξεκίνησα το FreeBSD σε single user mode, προσάρτησα τον εξωτερικό μου δίσκο:

mount /dev/da0s2d /mnt

και μερικά γρήγορα dumps αποθήκευσαν το σύστημα μου:

cd /mnt
dump -0 -au -h0 -f rootfs.dump /
dump -0 -au -h0 -f varfs.dump /var
dump -0 -au -h0 -f usrfs.dump /usr

So far so good. Έσβησα τα πάντα, εγκατέστησα τα windows, χωριστό partition για το λειτουργικό και για τα δεδομένα (που δεν πρόκειται να υπάρξουν ποτέ, αλλά δεν πειράζει) και εγκατέστησα ότι θα χρειαστώ. Όταν έμεινα ικανοποιημένος από την εγκατάσταση, αποφάσισα να ξαναβάλω και το FreeBSD στον υπόλοιπο δίσκο (τεράστιος για πειράματα, 500Gb).

To θέμα είναι πως θα επιλέγω μεταξύ λειτουργικών. Παλιότερα (στα Vista) είχα χρησιμοποιήσει σε αντίστοιχες περιπτώσεις με μεγάλη επιτυχία το πρόγραμμα EasyBCD. Αλλά σήμερα αποφάσισα να ακολουθήσω μια άλλη τακτική: Θα χρησιμοποιούσα το fdisk στο FreeBSD και το Computer Management / Disk Administrator από τα Windows για να κάνω κάθε φορά active το partition του λειτουργικού που επιθυμώ. Όπως είναι γνωστό τα Windows θα χρησιμοποιήσουν το MBR ενώ στο FreeBSD μπορώ σίγουρα να πω να μην το πειράξει. Μια χαρά μέχρι εδώ.

Boot λοιπόν με το LiveFS του FreeBSD, δημιουργία του slice από το fdisk του sysinstall με Leave the MBR untouched και έξοδος στο fixit. Εδώ φτιάχνω τα partitions με την bsdlabel:

bsdlabel -w /dev/ad4s4

Επεξεργασία με το χέρι:

bsdlabel -e /dev/ad4s4

Εγκατάσταση boot blocks:

bsdlabel -B /dev/ad4s4

Newfs στα partitions:

newfs /dev/ad4s4a
newfs -U /dev/ad4s4d
newfs -U /dev/ad4s4e
newfs -U /dev/ad4s4f

Mount στον εξωτερικό δίσκο:

mkdir /disk
mount /dev/da0s2d /disk

Και restore τα partitions:
mount /dev/ad4s4a /mnt
cd /mnt
TMPDIR=/mnt restore -rvf /disk/rootfs.dump

Πριν την αποπροσάρτηση, χρειάζεται μια μικρή διόρθωση στο /mnt/etc/fstab καθώς το slice έχει αλλάξει. Αυτό έγινε με το vi.

cd /
umount /mnt
mount /dev/ad4s4d /mnt
cd /mnt
TMPDIR=/mnt restore -rvf /disk/varfs.dump
cd /
umount /mnt
mount /dev/ad4s4f /mnt
cd /mnt
TMPDIR=/mnt restore -rvf /disk/usrfs.dump

Με την ολοκλήρωση της διαδικασίας, το slice του FreeBSD είναι ήδη active (από την fdisk του sysinstall), οπότε έξοδος από το fixit, επανεκκίνηση και σύντομα θα είμαστε στην κονσόλα του FreeBSD. Πρέπει μόνο να θυμηθούμε να φτιάξουμε το sticky bit στο /tmp και /var/tmp:

chmod -R 1777 /tmp /var/tmp

Ωρα να ξεκινήσουμε ξανά τα Windows. Χρησιμοποιούμε την fdisk για να αλλάξουμε το active partition στο 1.

sysctl kern.geom.debugflags=16
fdisk -a /dev/ad4

Επανεκκίνηση και είμαστε στα Windows. Είμαστε έτοιμοι να κάνουμε ξανά την αλλαγή του active partition για να γυρίσουμε στο FreeBSD. Control Panel, Computer Management, Administrative Tool, Disk Administrator - με δεξί κλικ και Run as Administrator για να είμαστε σίγουροι ότι δεν θα πεταχτεί κανένα UAC από πουθενά. Και να η εικόνα που θα δούμε:



Όλα καλά θα πείτε. Για δοκιμάστε όμως να κάνετε ενεργό το partition του FreeBSD:



Healthy, primary partition, αλλά όχι κύριε δεν θα το κάνετε active. Οι εντολές είναι ανενεργές. Γιατί φοβόμαστε ότι δεν ξέρετε τι κάνετε αν και το εργαλείο βρίσκεται στα Administrative Tools. Και για να παραφράσω, αγαπητή MS αν πιστεύεις ότι τα εργαλεία διαχείρισης είναι για χαζούς Administrators, μόνο χαζοί Administrators θα τα χρησιμοποιούν. Ή μάλλον, μόνο χαζοί γενικώς.

Και για να είστε σίγουροι ότι το εργαλείο είναι επίτηδες crippled, το παραπάνω γίνεται μια χαρά από τη γραμμή εντολών. All Programs -> Accessories -> Command prompt (δεξί κλικ, Run as Administrator):

diskpart

DISKPART> select disk=0
Disk 0 is now the selected disk
DISKPART> list partition
(...list of partitions... το FreeBSD είναι το 4)
DISKPART> select partition=4
Partition 4 is now the selected partition
DISKPART> active
DiskPart marked the current partition as active

Reboot, και είμαστε πίσω στο FreeBSD. Τουλάχιστον εκεί δεν γράφεις 100 εντολές για να κάνεις active ένα slice. Και το σύστημα δεν θεωρεί τους administrators ηλίθιους!