Hlavní navigace

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

Jiří Bělka 22. 6. 2004

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.

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 :)

Našli jste v článku chybu?

27. 7. 2004 20:15

jirib (neregistrovaný)

pomoci:

# pw lock test

dostanete toto:

test:*LOCKED*9FwQHW2Y0H6r2:1000:1000::0:0:test:/home/test:/bin/tcsh

# pw unlock test

test:9FwQHW2Y0H6r2:1000:1000::0:0:test:/home/test:/bin/tcsh

easy :)

jirib















24. 6. 2004 9:27

jam (neregistrovaný)

tak to sorry, jenom jsem tlachal o tom co jsem cetl (v ocekavani, ze jste to ani nezkusil a jen remcate... za toto se hluboce omlouvam). prakticke zkusenosti nemam, nikdy jsem nemel tu potrebu.

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

DigiZone.cz: Ohrozí Freedom TV přechodové sítě?

Ohrozí Freedom TV přechodové sítě?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?