Začínáme bezpečně s FreeBSD (2)

22. 6. 2004
Doba čtení: 9 minut

Sdílet

Jsme tu opět s naším seriálem pro začínající a pokročilejší uživatele, kteří chtějí poznat FreeBSD a bezpečně jej i zvládnout. V minulém dílu jsme se věnovali základům. Dnes se podíváme na to, jak se na FreeBSD vytvářejí, odstraňují a modifikují uživatelské účty. Také se podíváme, jak takové účty případně blokovat.

Vytváření uživatelů a skupin

Před vytvářením nových uživatelů je třeba se zamyslet nad nějakým rozumným postupem, jak budeme definovat uživatelská jména. V případě více uživatelů bude vhodné kombinovat jméno a příjmení uživatele, např. Petr Novák – penovak. Maximální počet znaků uživatelského jména je ve FreeBSD omezen na 16 znaků a nesmí začínat „-“ (spojovníkem). Rovněž některé protokoly limitují počet znaků na 8, např. NIS.

Informace o uživatelských účtech se nachází v níže uvedených souborech v adresáři /etc:

Tabulka č. 571
Soubor Funkce Typ
passwd uchovává informace o uživatelích ASCII text
master.passwd stejný jako passwd plus obsahuje zašifrovaná hesla ASCII text
pwd.db databázová verze souboru passwd Berkeley DB Hash file
spwd.db databázová verze souboru master.passwd Berkeley DB Hash file

Protože jsou si soubory /etc/passwd a /etc/master.passwd hodně podobné, podíváme se, z čeho se skládá master.passwd (oproti /etc/passwd obsahuje několik polí navíc).

Soubor je klasický ASCII text, jednotlivý uživatelský řádek se skládá z následujících polí, jsou oddělena : (dvojtečkou):

root:$2a$04$fESJZVTE6qXzDx45yYP1AuQmQRPw6kW6jCNVR4OIwbMUcgS Ia6AGm:0:0::1093816800:0:I'm a King :/root:/bin/csh
uziv_jmeno:hash:uid:gid:trida:platnost_hesla:platnost_uctu: gecos:domov_adresar:shell 

(Pozn. red.: zde i dále byla mezera do hesla přidáná násilím kvůli sazbě –Johanka)

Informace o skupinách se nacházejí v /etc/group. Obsahuje následující pole: skupina, zašifrované heslo (téměř se nepoužívá, je proto nahrazeno * (hvězdičkou), gid (group's decimal ID) a poslední pole obsahuje členy skupiny.

V našem případě vytvoříme uživatelskou skupinu users, která bude zároveň primární skupinou pro obyčejné uživatele. Standardně FreeBSD vytváří pro každého uživatele vlastní primární skupinu se stejným jménem. Tímto krokem jsme si ulehčili pozdější konfiguraci OpenSSH, kde můžeme povolit vzdálené přihlašování podle uživatelů resp. skupin, skupiny však musí být primární. Zápis do /etc/group, který obsahuje záznamy o skupinách, můžeme provést ručně pomocí vi nebo pomocí příkazu  pw.

srot# pw group add users 

Jestliže si myslíte, že byste mohli udělat, např. při ruční editaci /etc/group, chybu (v syntaxi), můžete použít příkaz chkgrp, který soubor projde a vypíše hlášení, pokud najde nějaké chyby. Například kdybyste měli takový řádek v  /etc/group:

jezismarja:2004:
srot# chkgrp
chkgrp: /etc/group: line 28: missing field(s) 

Nyní je čas vytvořit „prostého“ uživatele (zebrak) bez zvláštních privilegií. Rovněž vytvoříme našeho „běžného“ uživatele, který bude členem skupiny „wheel“, aby tak mohl získal práva superuživatele. FreeBSD k tomu má příkaz adduser. Jestliže spouštíte příkaz adduser poprvé, vytvoří se soubory /etc/adduser.conf a /etc/adduser.message, konfigurační soubor pro vytváření nových uživatelů a uvítací zpráva.

Poznamka: Jestliže si vzpomenete na minulý díl a konfigurování /etc/login.conf a parametry passwordtime, je důležité vědět, že příkaz adduser nepřidá záznam o životnosti uživatelova hesla do /etc/master.passwd. Je to kvůli tomu, že adduser nepoužívá příkaz passwd. Viz níže z  man login.conf:

passwordtime   time   Used by passwd(1) to set next password expiry date. 

Nebojte, řekneme si, jak to správně ošetřit.

Nastavením adduser.conf vás provede příkaz při prvním spuštění; my však hovíme ruční editaci, proto použijeme adduser -config_create a následně upravíme vzniklý konfigurační soubor, aby obsahoval tyto změněné položky:

# verbose = [0-2]
verbose = 0

Změníme „ukecanost“ programu adduser, aby se nás při přidávání uživatele ptal pouze na to podstatné, tj. na položky pro nového uživatele.

# copy dotfiles from this dir ("/usr/share/skel" or # "no")
dotdir = "no" 

Dále doporučuji automaticky nekopírovat obecné systémové konfigurační soubory do uživatelských adresářů z /usr/share/skel. Tyto soubory by totiž mohly měnit nastavení v /etc/login.conf. Jestliže by váš uživatel chtěl měnit vlastní konfigurační soubory, např. .cshrc pro C-Shell, určitě je již natolik zkušený, že bude vědět, odkud si je zkopírovat a jak si je upravit. V případě, že se přesto rozhodnete tyto soubory uživatelům automaticky kopírovat, změňte v adduser.conf  umístění z /usr/share/skel  na /usr/local/share/skel, popř. podadresáře podle tříd/skupin. Tímto usnadníte případný upgrade systému.

# send this file to new user ("/etc/adduser.message" or "no")
send_message = "/usr/local/etc/adduser.message"
# default HOME directory ("/home")
home = "/home/users" 

Změníme umístění uvítací zprávy (tu si změňte podle libosti). Jestliže hodláte do uvítací zprávy vložit např. emailovou adresu, je třeba před znak @ vložit \, aby byla adresa správně interpretována. Teda např. „kontaktujte nás na admin\@nasser­ver.cz“.

# defaultgroup ('USER' for same as username or any other valid group)
defaultgroup = users
# defaultclass if not empty
defaultclass = "users" 

Dále nastavíme program tak, že bude automaticky ohlašovat přidání uživatelů při vytváření do skupiny users a třídy users (tu jsme si nakonfigurovali v  /etc/login.conf).

Nyní se konečně pustíme na přidání uživatele.

srot# adduser zebrak
Use option ``-verbose'' if you want to see more warnings and questions or try to repair bugs.
Enter username [^[a-z0-9_][a-z0-9_-]*$]: zebrak
Enter full name []: Zebrak
Enter shell csh date no sh tcsh [tcsh]:
Enter home directory (full path) [/home/users/zebrak]:
Uid [1000]:
Enter login class: default users [users]:
Login group users zebrak [users]:
Login group is ``users''. Invite zebrak into other groups: guest no
[no]:
Enter password []:
Enter password again []:
Name: zebrak
Password: ****
Fullname: Zebrak
Uid: 1000
Gid: 1000 (users)
Class: users
Groups: users
HOME: /home/users/zebrak
Shell: /bin/tcsh
OK? (y/n) [y]: y
Added user ``zebrak''
Send message to ``zebrak'' and: no root second_mail_address
[no]:
Ahoj,
tvuj ucet ``zebrak'' byl vytvoren.
Tak si ho uzij!
Mrkni na prikazy chpass(1), finger(1), passwd(1)
Add anything to default message (y/n) [n]: n
Send message (y/n) [y]: n
Add another user? (y/n) [y]: n 

V případě, že chcete založit uživatele s jinými hodnotami, stačí k příkazu přidat příznak -v (verbosity, ukecanost). Nyní si ještě vytvořte svého „lepšího“ uživatele, kterého přidáte do skupiny wheel.

Takže jak je to s tou platností hesla? Jestliže se nyní podíváte na pole pro uživatele zebrak, zjistíte, že platnost_hesla je 0.

srot# grep zebrak /etc/master.passwd
zebrak:$2a$04$dkhkdR1plBkFhBZotJdY0uPt36sMl2AXFo5 BbymRqISXmq8.A4UJa:1000:1000:users:0:0:Zebrak: /home/users/zebrak:/bin/tcsh 

Jak již bylo řečeno, příkaz adduser nepoužívá passwd, který z /etc/login.conf  přečte nastavení passwordtime a doplní jej do /etc/master.passwd. Napravit to můžete buď spuštěním passwd a znovunapsáním hesla uživatele, passwd pak aktualizuje potřebné pole v master.passwd, nebo vytvářením uživatelských účtů pomocí příkazu pw. Podívejte se na jeho syntaxi:

srot# pw --help
usage:
pw [user|group|lock|unlock] [add|del|mod|show|next] [help|switches/values] 

Příkaz pw obsahuje rovněž mnoho přepínačů, též může disponovat vlastním konfiguračním souborem, pro více informací man pw. Náš testovací příkaz bude tedy vypadat takto:

srot# pw user add -n test -c "Test Testovic" -m -d /home/users/test -g users -L users -p +90d -s /bin/tcsh -h 0 

Vysvětlení: -n (name), -c (gecos), -m (vytvoří domovský adresář), -d (definuje cestu k domovskému adresári), -g primární uživatelská skupina, -L (třída), -p (platnost hesla; pro čas. definici man pw), -s (shell), -h (jestliže bude -h fd, vytvoří se účet bez hesla).

Odstraňování a pozměňování uživatelových informací

Jestliže chcete uživatele odstranit, použijte příkaz rmuser, který odstraní uživatele, domovský adresář a další uživatelovy systémové soubory, např. /var/mail/user nebo soubory v  /tmp.

Ke změně informací o uživateli použijte příkaz chpass. Možnosti příkazu se mění podle toho, jestli je spuštěn superadministrá­torem, nebo uživatelem.

Přidávání uživatelů do skupin

Přidávat uživatele do skupin můžete buď ruční editací souboru /etc/group např. pomocí vi, nebo opět pomocí příkazu  pw.

srot# pw groupmod wheel -M test 

Příznak -M definuje „members list“, tj. seznam uživatelů. Nyní se podíváme na provedené změny.

srot# grep test /etc/group
wheel:*:0:gooduser,test 

Blokování uživatelů a skupin

Někdy se vám může hodit (dočasně) blokovat určitého uživatele. Toto jde ošetřit více způsoby, záleží na tom, co chcete přesně udělat.

Jestliže chcete účet zcela zablokovat, stačí pozměnit pomocí vipw zašifrované heslo v /etc/master.passwd (vipw totiž při editaci soubor „uzamkne“, čímž nemůže dojít k jeho poškození). Příklad:

zebrak:*warez$2a$04$9cQ88Y8UdsdZRoEIIMlRsenKU6btL rwhqnNdiGaDKBXFmrel/iYDi:1000:1000:users:0:0:Zebrak: /home/users/zebrak:/bin/tcsh 

Jak vidíte, na začátek hesla zašifrovaného pomocí blowfish jsme přidali *warez, tj. jednoduše jsme zneplatnili heslo a přidali si popisek důvodu, v tomto případě warez. Všechny pokusy o neúspěšné zadání hesla se budou ukládat do logů.

Další nastavení můžete provádět v souboru /etc/login.access. Doporučuji opět RCS, jinak budete mít o zábavu v případě špatně napsaných pravidel postaráno! Například chcete, aby se na místní konzoli/virtuálním terminálu mohli přihlásit pouze uživatelé ze skupiny wheel. Syntaxe souboru login.access je jednoduchá. Pravidla jsou rozdělena na tři pole oddělená : (dvojtečkou). Dále je uplatněno pravidlo „první vyhrává“, proto je důležitá posloupnost pravidel. Pole jsou akce, uživatel/uživa­telská skupina a typ přihlášení. Soubor defaultně dává možnost přihlásit se všem, pokud znají heslo.

+:wheel root:ttyv0 ttyv1 ttyv2 ttyv3 ttyv4 ttyv5 ttyv6 ttyv7
-:ALL:ttyv0 ttyv1 ttyv2 ttyv3 ttyv4 ttyv5 ttyv6 ttyv7
+:ALL:ALL 

Nebo zkráceně pomocí EXCEPT.

-:ALL EXCEPT wheel:ttyv0 ttyv1 ttyv2 ttyv3 ttyv4 ttyv5 ttyv6 ttyv7 

Vynechali jsme řádek +:ALL:ALL, poněvadž login.access defaultně přihlášení povoluje, tudíž je zbytečný. Rovněž můžete povolit přihlášení z jakéhokoliv místa pouze určité skupině uživatelů.

-:ALL EXCEPT users:ttyv0 ttyv1 ttyv2 ttyv3 ttyv4 ttyv5 ttyv6 ttyv7
-:ALL EXCEPT users:ALL 

Tato nastavení lze různě kombinovat. Můžete mít několik pravidel pro různé skupiny, uživatele či typy přihlášení. Rovněž toto nastavení jde kombinovat jen s programy, které spolupracují s příkazem login. Např. OpenSSH v základním nastavení na FreeBSD s příkazem login nespolupracuje, stejně jako FTP. Nastavením OpenSSH se budeme zabývat později. Pro bližší informace použijte  man login.access.

Také můžete využít souboru login.conf a zablokovat celou třídu uživatelů pomocí položky nologin a správně definovat příkaz  /sbin/nologin.

:nologin=/sbin/nologin:\

Po změně musíte opět provést aktualizaci login databáze pomocí příkazu cap_mkdb /etc/login.conf.

Zajímavé odkazy

FreeBSD Handbook (předtím, než budete cokoli hledat na webu nebo se ptát na IRC, hledejte povinně v příručce)
BSDHount.com
BSDvault – FreeBSD Help
FreeBSD Diary
OnLamp.com – FreeBSD Basics
ezUnix.org – FreeBSD
Defcon 1 – FreeBSD Help
FreeBSD (stránka slovenského uživatele)
FreeBSD Howtos

A kde můžete kecat o FreeBSD na IRC? Že nevíte, co je IRC? Pak čtěte zde.

bitcoin_skoleni

IRCnet #bsd.cz
EFNet #FreeBSDhelp
UNDERNET #FreeBSD
HybNet  #FreeBSD

Závěr

Dneska jsme letmo vstřebali téma uživatelů a skupin. Naučili jsme se základní techniky a postupy. Pro podrobnější nápovědu doporučuji manuálové stránky k uvedeným programům. V příštím dílu se podíváme na přístupová práva k souborům a konečně na něco zajímavého, příznaky souborů, které činí FreeBSD opravdu velmi silným vůči útokům. Máte se na co těšit :)