---
title: Rozdział 13. Użytkownicy i podstawy zarządzania kontami
part: Część III. Administracja systemem
prev: books/handbook/boot
next: books/handbook/security
showBookMenu: true
weight: 17
params:
  path: "/books/handbook/users/"
---

[[users]]
= Użytkownicy i podstawy zarządzania kontami
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumoffset: 13
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/users/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[users-synopsis]]
== Streszczenie

FreeBSD umożliwia pracę z komputerem wielu użytkownikom w tym samym czasie. Oczywiście, tylko jedna osoba może w danej chwili siedzieć przed monitorem i klawiaturą , lecz dowolna liczba użytkowników może być zalogowana przez sieć. By móc korzystać z systemu, każdy użytkownik musi posiadać konto.

Po przeczytaniu tego rozdziału, będziemy wiedzieć:

* Jakie są różnice pomiędzy różnymi kontami użytkowników w systemie FreeBSD.
* Jak dodawać konta użytkowników.
* Jak usuwać konta użytkowników.
* Jak modyfikować szczegóły konta, np. pełną nazwę użytkownika czy preferowaną powłokę.
* Jak ograniczać dostęp do zasobów takich jak pamięć i czas procesora w oparciu o konta i grupy użytkowników.
* Jak korzystać z grup by ułatwić zarządzanie kontami.

Przed przeczytaniem tego rozdziału, powinniśmy:

* Znać podstawy obsługi systemów UNIX(R) i FreeBSD (crossref:basics[basics,Podstawy Uniksa]).

[[users-introduction]]
== Wprowadzenie

Konta umożliwiają dostęp do systemu. Natomiast procesy uruchamiane są przez użytkowników. Stąd też zarządzanie kontami systemowymi i użytkowników stanowi integralny element systemów FreeBSD.

Z każdym kontem w systemie FreeBSD skojarzone są pewne informacje służące do jego identyfikacji.

Nazwa użytkownika::
Nazwa użytkownika, jaka byłaby podana w zgłoszeniu `login:`. Nazwy użytkowników muszą być unikalne w danym komputerze; nie możemy posiadać dwóch użytkowników o tej samej nazwie. Kilka reguł tworzenia poprawnych nazw użytkowników opisuje podręcznik man:passwd[5]. Z reguły stosuje się nazwy składające się z ośmiu bądź mniejszej ilości znaków pisanych małą literą.

Hasło::
Każde konto posiada hasło. Hasło może być puste, w tej sytuacji nie będzie wymagane żadne hasło by uzyskać dostęp do systemu. Z reguły jest to bardzo złym pomysłem; każde konto powinno zabezpieczone hasło.

Identyfikator użytkownika (UID)::
UID jest numerem, tradycyjnie z przedziału od 0 do 65535, wykorzystywanym do jednoznacznej identyfikacji użytkownika w systemie. Do identyfikacji użytkowników FreeBSD wewnętrznie wykorzystuje UID - każde polecenie FreeBSD przyjmujące nazwę użytkownika jako argument zamieni ją na identyfikator UID przed rozpoczęciem. Oznacza to, że możemy posiadać kilka kont o różnych nazwach użytkowników ale o tym samym UID. Z punktu widzenia FreeBSD konta te są jednym i tym samym użytkownikiem. Tym nie mniej jest mało prawdopodobne byśmy kiedykolwiek tego potrzebowali.

Identyfikator grupy (GID)::
GID jest numerem, tradycyjnie z przedziału od 0 do 65535, wykorzystywanym do jednoznacznej identyfikacji podstawowej grupy, do której należy użytkownik. Grupy stanowią mechanizm kontroli dostępu do zasobów na podstawie identyfikatora GID użytkownika w miejsce jego UID. Pozwala to znacznie zredukować rozmiar niektórych plików konfiguracyjnych. Użytkownik może należeć do więcej niż jednej grupy.

Klasa logowania::
Klasy logowania stanowią rozszerzenie mechanizmu grup, dostarczając dodatkowej elastyczności w procesie dopasowywania systemu do różnych użytkowników.

Czas zmiany hasła::
Domyślnie FreeBSD nie zmusza użytkowników do regularnego zmieniania haseł. Możemy jednak wymusić takie zachowanie narzucając niektórym bądź wszystkim użytkownikom zmianę ich haseł w określonych odstępach czasowych.

Czas wygaśnięcia konta::
Domyślnie FreeBSD nie stosuje wygasania kont. Jeśli tworzymy konta, o których wiemy, że będą miały ograniczoną żywotność, np. w szkole, gdzie zarządzamy kontami studentów, możemy określić kiedy konto wygaśnie. Po upływie terminu wygaśnięcia konto nie będzie mogło być wykorzystane do logowania się do systemu, chociaż katalogi i pliki użytkownika pozostaną w systemie.

Pełna nazwa użytkownika::
Nazwa użytkownika w sposób jednoznaczny identyfikuje konta we FreeBSD, jednakże dość często nie odzwierciedla prawdziwych nazwisk użytkowników. Informacja ta może zostać dołączona do konta.

Katalog macierzysty::
Katalog macierzysty określa pełną ścieżkę dostępu do katalogu w systemie, w którym dany użytkownik będzie rozpoczynał pracę po każdym zalogowaniu się do systemu. Z reguły katalogi macierzyste wszystkich użytkowników umieszczane są w katalogach [.filename]#/home/nazwa_użytkownika# lub [.filename]#/usr/home/nazwa_użytkownika#. W swoich katalogach macierzystych użytkownicy przechowują pliki i katalogi, które mogą tworzyć, modyfikować i usuwać według własnego uznania.

Powłoka użytkownika::
Powłoka udostępnia użytkownikowi domyślne środowisko wykorzystywane do interakcji z systemem. Istnieje wiele różnych rodzajów powłok. Doświadczeni użytkownicy z pewnością posiadają własne upodobania, które mogą mieć odwzorowanie w ustawieniach ich kont.

Istnieją trzy podstawowe typy kont: konto <<users-superuser,Superużytkownika>>, <<users-system,konta systemowe>> i <<users-user,konta użytkowników>>. Konto Superużytkownika, z reguły nazywane `root`, wykorzystywane jest do zarządzania systemem z nieograniczonymi uprawnieniami. Konta systemowe wykorzystywane są do uruchamiania usług. Konta użytkowników natomiast wykorzystywane są przez prawdziwych ludzi, którzy logują się, czytają pocztę itp.

[[users-superuser]]
== Konto superużytkownika

Konto superużytkownika, z reguły nazywane kontem `root`, domyślnie jest tak skonfigurowane, by ułatwić administrację systemem i jako takie nie powinno być wykorzystywane do codziennych zajęć, jak np. wysyłanie i odbiór poczty, ogólne zgłębianie systemu czy programowanie.

Powodem tego jest fakt, iż superużytkownik - w przeciwieństwie do zwykłego użytkownika - może działać bez żadnych ograniczeń. Stąd też niewłaściwe użycie tego konta może skończyć się spektakularną katastrofą. Konta użytkowników nie są zdolne przez pomyłkę uszkodzić systemu. Tak więc najlepszym rozwiązaniem jest korzystanie z konta zwykłego użytkownika kiedy tylko to możliwe, chyba że szczególnie potrzebujemy dodatkowych uprawnień.

Skoro dodatkowa spacja bądź brak znaku mogą doprowadzić do nieodwracalnej utraty danych, zawsze powinniśmy sprawdzać polecenie wydawane jako superużytkownik dwu- lub nawet trzykrotnie.

Tak więc pierwszą rzeczą, którą powinniśmy zrobić po przeczytaniu tego rozdziału - jeśli jeszcze tego nie zrobiliśmy - jest stworzenie dla siebie konta nieuprzywilejowanego użytkownika do ogólnego zastosowania. Dotyczy to zarówno sytuacji gdy korzystamy z systemu o wielu użytkownikach jak i gdy pracujemy na maszynie sami. W dalszej części tego rozdziału omówiony zostanie proces tworzenia dodatkowego konta oraz zmiany trybu pracy pomiędzy zwykłym użytkownikiem a superużytkownikiem.

[[users-system]]
== Konta systemowe

Konta systemowe wykorzystywane są do uruchamiania usług, takich jak np. DNS, poczta, serwery WWW itd. Powodem takiego wykorzystania kont jest bezpieczeństwo; jeśli wszystkie usługi pracowałyby jako superużytkownik, mogłyby działać bez żadnych ograniczeń.

Przykładami kont systemowych są `daemon`, `operator`, `bind` (dla serwera DNS), `news` oraz `www`.

`nobody` jest standardowym nieuprzywilejowanym kontem systemowym. Tym nie mniej należy pamiętać, że im więcej usług będzie pracowało jako użytkownik `nobody`, z tym większą ilością plików i procesów będzie on związany i tym samym uzyska większe przywileje.

[[users-user]]
== Konta użytkowników

Konta użytkowników są dla rzeczywistych osób podstawowym środkiem dostępu do systemu. Izolują one użytkowników od otoczenia, uniemożliwiając im uszkodzenie systemu bądź danych innych użytkowników, pozwalając im przy tym dostosować do własnych potrzeb środowisko pracy.

Każda osoba korzystająca z naszego systemu powinna posiadać unikalne konto użytkownika. Pozwala to nam sprawdzić co kto robi, a także uniemożliwić użytkownikom ingerencję w ustawienia innych użytkowników, czytać sobie na wzajem pocztę itd.

Każdy użytkownik może dostosować własne środowisko pracy wykorzystując alternatywne powłoki, edytory, skróty klawiszone czy język.

[[users-modifying]]
== Modyfikacja ustawień kont

W środowisku systemów UNIX(R) dostępnych jest szeroka gama różnorodnych poleceń do manipulacji kontami użytkowników. Najczęściej wykorzystywane zostały omówione poniżej, wraz z przykładami zastosowania.

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Polecenie
| Opis

|man:adduser[8]
|Zalecane pogram wiersza poleceńdo dodawania nowych użytkowników.

|man:rmuser[8]
|Zalecany program wiersza poleceń do usuwania użytkowników.

|man:chpass[1]
|Elastyczne narzędzie do zmiany informacji w bazie danych użytkowników.

|man:passwd[1]
|Proste polecenie wiersza poleceń do zmiany haseł użytkowników.

|man:pw[8]
|Potężne i elastyczne narzędzie do zmiany wszystkich parametrów kont użytkowników.
|===

[[users-adduser]]
=== `adduser`

man:adduser[8] jest prostym programem służącym do dodawania nowych użytkowników. Tworzy ono odpowiednie wpisy w plikach systemowych [.filename]#passwd# i [.filename]#group#, tworzy katalog macierzysty nowego użytkownika oraz kopiuje z [.filename]#/usr/shared/skel# domyślne pliki konfiguracyjne ("dotfiles"). Potrafi również wysłać nowemu użytkownikowi wiadomość powitalną.

[NOTE]
====
Przy wprowadzaniu hasła na ekranie nie są wyświetlane żadne znaki, nawet gwiazdki. Dlatego właśnie w tym momencie należy zwrócić szczególną uwagę, by się nie pomylić.
====

.Dodawanie użytkownika we FreeBSD
[example]
====

[source,shell]
....
# adduser
Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!
#
....

====

[[users-rmuser]]
=== `rmuser`

By całkowicie usunąć użytkownika z systemu, możemy skorzystać z man:rmuser[8]. Narzędzie te wykonuje następujące czynności:

[.procedure]
====
. Usuwa wpisy użytkownika w man:crontab[1] (jeśli jakieś są).
. Usuwa wszystkie prace man:at[1] należące do użytkownika.
. Niszczy wszystkie procesy użytkownika.
. Usuwa użytkownika z lokalnego pliku haseł w systemie.
. Usuwa katalog macierzysty użytkownika (jeśli jego właścicielem jest dany użytkownik).
. Usuwa pocztę należącą do użytkownika z [.filename]#/var/mail#.
. Usuwa wszystkie pliki z systemów tymczasowych, np. [.filename]#/tmp#, których właścicielem jest użytkownik.
. Ostatecznie, usuwa użytkownika z wszystkich grup w [.filename]#/etc/group#, do których należy. 
+
[NOTE]
======
Jeśli po usunięciu użytkownika grupa pozostanie pusta a nazwa tej grupy jest taka sama jak nazwa użytkownika, grupa jest również usuwana; dotyczy to przede wszystkim grup użytkowników stworzonych przez man:adduser[8].
======
====

Nie można wykorzystać man:rmuser[8] do usunięcia konta superużytkownika, gdyż prawie zawsze wskazuje to na masową destrukcję.

Domyślnie wykorzystywany jest tryb interaktywny, który stara upewnić się, że wiemy co robimy.

.Tryb interaktywny `rmuser`
[example]
====

[source,shell]
....
# rmuser jru
Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Updating password file, updating databases, done.
Updating group file: trusted (removing group jru -- personal group is empty) done.
Removing user's incoming mail file /var/mail/jru: done.
Removing files belonging to jru from /tmp: done.
Removing files belonging to jru from /var/tmp: done.
Removing files belonging to jru from /var/tmp/vi.recover: done.
#
....

====

[[users-chpass]]
=== `chpass`

man:chpass[1] zmienia w bazie danych użytkowników parametry konta, jak np. hasło, powłokę czy inne szczegółowe informacje.

Jedynie administrator systemu, jako superużytkownik, może zmieniać parametry kont i hasła innych użytkowników za pomocą man:chpass[1].

Jeśli nie podamy żadnych opcji bądź jedynie nazwę użytkownika, man:chpass[1] uruchomi edytor informacji o użytkowniku. Po wyjściu z edytora, baza danych użytkowników zostanie aktualizowana.

[NOTE]
====
Jeśli nie jesteśmy superużytkownikiem, przed opuszczeniem edytora zostaniemy zapytani o hasło.
====

.Tryb interaktywny `chpass` superużytkownika
[example]
====

[source,shell]
....
#Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
....

====

Zwykli użytkownicy mogą zmienić jedynie część tych informacji i jedynie własnych kont.

.Tryb interaktywny `chpass` zwykłego użytkownika
[example]
====

[source,shell]
....
#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
....

====

[NOTE]
====
man:chfn[1] i man:chsh[1] są jedynie dowiązaniami do man:chpass[1], podobnie jak man:ypchpass[1], man:ypchfn[1] i man:ypchsh[1]. Obsługa NIS jest automatyczna, tak więc dopisywanie `yp` przed poleceniem nie jest potrzebne. Jeśli jest to dla nas niezrozumiałe, nie martwmy się, crossref:network-servers[network-servers,Network Servers] opisuje NIS szczegółowo.
====

[[users-passwd]]
=== `passwd`

Użycie polecenia man:passwd[1] jest typowym sposobem zmiany własnego hasła, bądź hasła innego użytkownika jako superużytkownik.

[NOTE]
====
By uniknąć przypadkowych bądź nieuprawnionych zmian, nim będziemy mogli podać nowe hasło, musimy wpierw wpisać dotychczasowe.
====

.Zmiana własnego hasła
[example]
====

[source,shell]
....
% passwd
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done
....

====

.Zmiana hasła innego użytkownika jako superużytkownik
[example]
====

[source,shell]
....
# passwd jru
Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done
....

====

[NOTE]
====
Podobnie jak w przypadku man:chpass[1], man:yppasswd[1] jest jedynie dowiązaniem do man:passwd[1]. Tak więc NIS działa poprawnie z obydwoma poleceniami.
====

[[users-pw]]
=== `pw`

man:pw[8] jest programem wiersza poleceń służącym do tworzenia, usuwania, modyfikowania i wyświetlania użytkowników i grup. Działa jako pośrednik do systemowych plików użytkowników i grup. man:pw[8] dysponuje bardzo potężnym zestawem opcji, które umożliwiają wykorzystanie go w skryptach powłoki. Jednakże, nowym użytkownikom może wydać się zbyt skomplikowany w porównaniu z innymi przedstawionych tu poleceniami.

[[users-limiting]]
== Ograniczanie użytkowników

Jeśli w naszym systemie mamy wielu użytkowników konieczne może się okazać ograniczenie ich możliwości. FreeBSD posiada kilka sposobów na ograniczenie ilość zasobów systemowych, które dana osoba może wykorzystać. Ograniczenia te są podzielone na dwie grupy: udziały dyskowe i limity innych zasobów.

Udziały dyskowe (ang. quota) ograniczają dostępną użytkownikowi przestrzeń na dysku. Umożliwiają również szybkie sprawdzenie stopnia jej wykorzystania bez konieczności każdorazowego przeliczania. Udziały dyskowe szczegółowo omawia crossref:disks[quotas,File System Quotas].

Pozostałe limity dają możliwość ograniczenia wykorzystania czasu procesora, pamięci i innych zasobów, z których może korzystać użytkownik. Definiuje się je przy wykorzystaniu klas logowania i to właśnie one zostały tutaj opisane.

Klasy logowania określane są w pliku [.filename]#/etc/login.conf#. Szczegółowa semantyka wykracza dalece poza ramy tej sekcji. Jej pełen opis znaleźć można w podręczniku systemowym man:login.conf[5]. W tym momencie wystarczy powiedzieć, że każdy użytkownik posiada przypisaną klasę logowania (domyślnie jest to klasa `default`) przy czym każda klasa logowania dysponuje zestawem uprawnień. Uprawnieniami logowania są pary `nazwa=wartość`, gdzie _nazwa_ jest identyfikatorem a _wartość_ dowolnym ciągiem przetwarzanym w sposób zależny od nazwy. Konfiguracja klas logowania i uprawnień jest stosunkowo prostym zadaniem i również została opisana na stronach podręcznika systemowego man:login.conf[5].

[NOTE]
====
Normalnie system nie odczytuje konfiguracji bezpośrednio z pliku [.filename]#/etc/login.conf#, lecz odczytuje plik bazy danych [.filename]#/etc/login.conf.db#, który umożliwia szybsze przeszukiwanie. By wygenerować plik [.filename]#/etc/login.conf.db# z [.filename]#/etc/login.conf# należy uruchomić następujące polecenie:

[source,shell]
....
# cap_mkdb /etc/login.conf
....

====

Limity zasobów różnią się od typowych uprawnień logowania. Po pierwsze, dla każdego limitu istnieje tzw. miękki (aktualny) i twardy limit. Limit miękki może być zmieniany przez użytkownika bądź aplikację, lecz nie może być większy od twardego. Twardy natomiast może być zmniejszony przez użytkownika, lecz nie podwyższony. Po drugie, większość limitów zasobów dotyczy procesów danego użytkownika, nie użytkownika jako całości. Przy czym zauważyć należy, że różnice te wynikają ze względu na odmienne metody zarządzania limitami, nie zaś na implementację struktury uprawnień logowania (np. nie są one _na prawdę_ specjalnym przypadkiem uprawnień logowania).

Zatem, bez dalszych wstępów, zestawione poniżej zostały najczęściej wykorzystywane limity zasobów (opis pozostałych, razem z innymi uprawnieniami logowania, odnaleźć można w podręczniku man:login.conf[5]).

`coredumpsize`::
Ograniczenie rozmiaru pliku rdzenia generowanego przez program. Jest ono - z oczywistych powodów - podrzędne w stosunku do innych limitów wykorzystania przestrzeni dysku (np. `filesize` bądź udziałów dyskowych). Niemniej, limit ten jest powszechnie stosowany jako mniej surowa metoda kontroli wykorzystania przestrzeni na dysku: skoro użytkownicy sami nie generują plików rdzenia i często ich nie usuwają, ustawienie tego limitu może uchronić ich od utraty wolnej przestrzeni na dysku gdy duży program (np. emacs) ulegnie awarii.

`cputime`::
Jest to maksymalny czas procesora jaki może pochłaniać proces użytkownika. Procesy przekraczające zostaną zniszczone przez jądro. 
+
[NOTE]
====
Jest to ograniczenie ilości wykorzystywanego _czasu_ procesora, nie procent wykorzystania jaki wyświetlany jest w niektórych polach man:top[1] i man:ps[1]. Ograniczenie tego drugiego, na chwilę pisania tego tekstu, nie jest możliwe i byłoby raczej bezużyteczne: przykładowo kompilator - pracujący jako prawdopodobnie uzasadnione zadanie - może bardzo łatwo przez pewien czas zająć prawie 100% procesora.
====

`filesize`::
Jest to maksymalny rozmiar pliku, który może posiadać użytkownik. W przeciwieństwie do crossref:disks[quotas,udziałów dyskowych], limit ten rzutuje na wielkość poszczególnych plików, których właścicielem jest użytkownik, nie zaś na wszystkie jako całość.

`maxproc`::
Jest to maksymalna liczba procesów, które użytkownik może uruchomić. Dotyczy to zarówno procesy pierwszoplanowe jak i pracujące w tle. Z oczywistych względów, wartość ta nie może być większa niż ograniczenia systemowe parametru man:sysctl[8] `kern.maxproc`. Warto również zwrócić uwagę, iż zbyt niska wartość może utrudnić codzienną pracę: dość często okazuje się być przydatną możliwość zalogowania się w wielu sesjach bądź wykonywania poleceń potokowo. Niektóre zadania, jak np. kompilacja dużego programu, również tworzą wiele procesów (np. man:make[1], man:cc[1] i inne preprocesory pośrednie).

`memorylocked`::
Jest to maksymalna wielkość pamięci jakiej proces użytkownika może zablokować w pamięci głównej (np. patrz man:mlock[2]). Niektóre bardzo istotne dla poprawnego funkcjonowania systemu programy, jak np. man:amd[8], blokują się w głównej pamięci w taki sposób, że w przypadku problemów nie przykładają się do zniszczenia systemu.

`memoryuse`::
Jest to maksymalna wielkość pamięci, którą proces może w danym czasie wykorzystać. Dotyczy to zarówno pamięci głównej jak i przestrzeni wymiany. Limit ten nie wyłapuje wszystkich potencjalnych sytuacji wymagających ograniczania wykorzystania pamięci, lecz stanowi dobry początek.

`openfiles`::
Jest to maksymalna liczba plików, które proces może otworzyć. We FreeBSD pliki wykorzystywane są również do reprezentacji gniazd i kanałów IPC. Tym samym należy zachować ostrożność przy doborze właściwej wartości, by nie ustawić jej na zbyt niską. Ogólne ograniczenie tej wartości dla całego systemu definiowane jest przez zmienną man:sysctl[8] `kern.maxfiles`.

`sbsize`::
Jest to ograniczenie pamięci sieciowej, w tym również mbufs, którą może wykorzystać użytkownik. Limit ten został wprowadzony jako odpowiedź na stary atak DoS polegający na stworzeniu wielu gniazd sieciowych, lecz może również być wykorzystywany jako metoda ograniczenia komunikacji sieciowej.

`stacksize`::
Jest to maksymalny rozmiar, do którego może urosnąć stos procesu. w pamięci. Sam z siebie nie jest on wystarczający by ograniczyć ilość pamięci wykorzystywanej przez program. Powinien być stosowany w parze z innymi limitami.

Jest jeszcze kilka innych kwestii wartych pamiętania przy konfiguracji limitów zasobów. Poniżej zamieszczonych jest kilka ogólnych porad, sugestii i rozmaitych komentarzy.

* Procesy uruchomione w trakcie uruchamiania systemu przez [.filename]#/etc/rc# są przypisane do klasy logowania `daemon`.
* Chociaż plik [.filename]#/etc/login.conf# dostarczany wraz z systemem jest dobrym źródłem rozsądnych wartości dla większości ograniczeń, jedynie my - administratorzy - możemy wiedzieć, co jest odpowiednie dla naszego systemu. Ustawienie zbyt wysokich limitów może otworzyć nasz system na nadużycia, podczas gdy ustawienie za niskich może utrudnić codzienną pracę.
* Użytkownikom Systemu okien X (X11) powinno prawdopodobnie przyznać się więcej zasobów niż innym użytkownikom. X11 samo z siebie wykorzystuje dużo zasobów systemowych, lecz również zachęca użytkowników do jednoczesnego uruchamiania większej ilości programów.
* Pamiętajmy, że wiele limitów ma zastosowanie do indywidualnych procesów, nie użytkownika jako całości. Przykładowo, ustawienie `openfiles` na 50 oznacza, że każdy proces użytkownika może otworzyć do 50 plików. Tym samym całkowita liczba plików, które może otworzyć użytkownik wynosi wartość `openfiles` pomnożona o wartość `maxproc`. To samo dotyczy konsumpcji pamięci.

Więcej informacji o limitach zasobów, klasach logowania i ogólnych uprawnieniach znaleźć można w odpowiednich podręcznikach systemowych: man:cap.mkdb[1], man:getrlimit[2], man:login.conf[5].

[[users-groups]]
== Grupy

Grupa jest po prostu listą użytkowników. Grupy identyfikowane są na podstawie nazwy grupy oraz numeru GID (ang. Group ID). We FreeBSD (i w większości innych systemów UNIX(R)), dwoma czynnikami wykorzystywanymi przez jądro do określenia czy dany proces jest uprawniony do danej czynności jest identyfikator użytkownika (UID) oraz lista grup, do których użytkownik należy. W przeciwieństwie do UID, proces dysponuje listą grup powiązanych z nim. W różnych źródłach możemy przeczytać, że pewne rzeczy odnoszą się do "identyfikatora grupy" użytkownika bądź procesu; w większości przypadków oznacza to po prostu pierwszą grupę na liście.

Odwzorowanie nazwy grupy na identyfikator grupy znajduje się w pliku [.filename]#/etc/group#. Jest to prosty plik tekstowy z czterema polami oddzielonymi dwukropkiem. Pierwsze pole zawiera nazwę grupy, drugie zaszyfrowane hasło, trzecie identyfikator grupy a czwarte listę członków grupy oddzielonych przecinkami. Plik ten można śmiało edytować ręcznie (zakładając oczywiście, że nie popełnimy żadnych błędów składniowych!). Szczegółowy opis składni pliku znaleźć można na stronie podręcznika systemowego man:group[5].

Jeśli nie chcemy ręcznie edytować pliku [.filename]#/etc/group#, by dodawać i usuwać grupy, możemy wykorzystać polecenie man:pw[8]. Przykładowo, by dodać grupę o nazwie `teamtwo` a następnie potwierdzić, że została dodana możemy użyć:

.Dodawanie grupy za pomocą man:pw[8]
[example]
====

[source,shell]
....
# pw groupadd teamtwo
# pw groupshow teamtwo
teamtwo:*:1100:
....

====

Numer `1100` powyżej jest identyfikatorem grupy `teamtwo`. W chwili obecnej grupa ta nie zawiera żadnych członków i tym samym jest raczej bezużyteczna. Zmieńmy to zapraszając do grupy użytkownika `jru`.

.Dodawanie użytkownika do grupy za pomocą man:pw[8]
[example]
====

[source,shell]
....
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru
....

====

Parametrem opcji `-M` jest lista użytkowników oddzielonych przecinkami, którzy są członkami grupy. Z poprzednich sekcji wiemy, że plik haseł również zawiera przypisaną grupę dla każdego użytkownika. Jest to grupa, do której użytkownik został automatycznie dodany przez system. Taki użytkownik nie zostanie wyświetlony jako członek grupy gdy wykorzystamy polecenie man:pw[8] `groupshow`, jednakże wciąż będzie wyświetlany przy użyciu polecenia man:id[1] bądź innego podobnego narzędzia. Innymi słowy, man:pw[8] manipuluje jedynie plikiem [.filename]#/etc/group# i nigdy nie spróbuje odczytać dodatkowych informacji z pliku [.filename]#/etc/passwd#.

.Wykorzystanie man:id[1] do określenia członkostwa w grupach
[example]
====

[source,shell]
....
% id jru
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)
....

====

Jak widzimy, `jru` jest członkiem grup `jru` i `teamtwo`.

Więcej informacji o poleceniu man:pw[8] znaleźć można w jego podręczniku systemowym. Natomiast szczegółowe informacje o formacie pliku [.filename]#/etc/group# znajdują się w podręcznik man:group[5].
