Журнал LinuxFormat - перейти на главную

LXF159:Собственники файлов: ACL

Материал из Linuxformat
Перейти к: навигация, поиск


Раз­ре­шай­те ра­бо­тать со свои­ми фай­ла­ми по спи­скам управ­ле­ния дос­ту­пом

Содержание

Соб­ст­вен­ни­ки фай­лов: ACL

Соб­ст­вен­но­сти по­свя­ще­но де­вять де­ся­тых всех за­ко­нов; ну, а ес­ли на­до вы­дать фай­лы на за­пись не­сколь­ким поль­зо­ва­те­лям? Нейл Бот­вик рас­ска­жет про ACL.

По части вла­дель­цев фай­лов и прав досту­па линуксоиды про­хо­дят че­рез три ста­дии. Пер­вая – труд­но­сти: «По­че­му это так и по­че­му мне нельзя за­пи­сать файл сю­да?». Вто­рая – понимание поль­зы за­щи­ты фай­лов от слу­чай­но­го или на­ме­рен­но­го из­менения или уда­ления. Тре­тья за­тра­ги­ва­ет не всех – это недо­воль­ст­во ог­раничения­ми сис­те­мы. Глав­ное из них в том, что у ка­ж­дого объ­ек­та – фай­ла или ка­та­ло­га – толь­ко один вла­де­лец, и это ОК, по­ка в сис­те­ме всего один поль­зо­ва­тель (кстати, root мы поль­зо­ва­те­лем не счи­та­ем – он обыч­но не ра­бо­та­ет с сис­те­мой, а толь­ко ад­минист­ри­ру­ет ее). А сто­ит поя­вить­ся несколь­ким поль­зо­ва­те­лям, ко­то­рым нуж­но из­ме­нять фай­лы друг дру­га, все услож­ня­ет­ся. Си­туа­ция это нередкая: например, удобно иметь об­щий ка­та­лог, где вся се­мья хранит фо­тки и ра­бо­тает с ними. Очень час­то об­щий доступ к фай­лам нужен несколь­ки­м сотрудникам или от­де­ления­м офи­са. Всех этих поль­зо­ва­те­лей мож­но свести в од­ну груп­пу и поль­зо­вать­ся ка­та­ло­гом, ко­то­рым вла­деет груп­па, с пра­вом на запись; но если кто-то соз­даст внутри но­вый файл или ка­та­лог, его вла­дель­цем с правом на за­пи­сь бу­дет толь­ко он сам.

Спи­ски управ­ления досту­пом

Что­бы улуч­шить такую сис­те­му «все или ниче­го», ну­жен бо­лее тон­кий кон­троль над тем, кто, что и где мо­жет де­лать. При несколь­ких усло­виях такое по­зво­ляют спи­ски управ­ления досту­пом (Access Control Lists, ACL), рас­ши­рение боль­шин­ст­ва фай­ло­вых сис­тем (ФС) Linux. Для начала нужно яд­ро со встрое­нной под­держ­кой ACL – в лю­бом яд­ре из ди­ст­ри­бу­ти­ва она бу­дет, но соби­рая свое, не за­будь­те за­дать па­ра­метр CONFIG_EXT4_FS_POSIX_ACL или со­от­вет­ст­вую­щий для дру­гой ФС. Далее, ACL надо ак­ти­ви­ро­вать при мон­ти­ро­вании ФС – в ФС ти­па XFS и Btrfs это вклю­че­но по умол­чанию, но для ФС ext в об­щем по умол­чанию не делается, надо потрудиться самим. Что­бы ACL ак­ти­ви­ро­ва­лись при за­груз­ке сис­те­мы, от­крой­те /etc/fstab и до­бавь­те acl к спи­ску оп­ций мон­ти­ро­вания фай­ло­вой сис­те­мы (оп­ции раз­де­ля­ют­ся за­пя­ты­ми):

/dev/sda5 /home ext4 noatime,acl 0 0

Этот па­ра­метр всту­пит в дей­ст­вие после пе­ре­за­груз­ки. Что­бы ак­ти­ви­ро­вать ACL сразу, пе­ре­мон­ти­руй­те фай­ло­вую сис­те­му с до­полнитель­ной оп­ци­ей, на­при­мер, так:

sudo mount /home -o remount,acl

На­конец, нужны поль­зо­ва­тель­ские ути­ли­ты ACL, уста­нав­ли­ва­емые в со­ста­ве па­ке­та ACL. Основ­ные ути­ли­ты – setfacl (за­да­ет пра­ва досту­па ACL для фай­ла/ка­та­ло­га) и getfacl (ото­бра­жа­ет их).

За­да­дим про­стой ACL

Нач­нем с при­ме­ра. Ко­ман­ды:

touch имя­Фай­ла

ls -l имя­Фай­ла

да­дут сле­дую­щий ре­зуль­тат:

-rw-r--r-- 1 nelz users 0 Apr 11 15:14 имя­Фай­ла

– обыч­ный файл с обыч­ны­ми пра­ва­ми на чте­ние/дос­туп для од­но­го поль­зо­ва­те­ля. По­смот­рим, что о нем ска­жет ко­ман­да getfacl.

getfacl имя­Фай­ла

вы­ве­дет сле­дую­щее:

  1. file: имя­Фай­ла
  1. owner: nelz
  1. group: users

user::rwgroup::

r--

other::r--

Ре­зуль­тат при­мер­но тот же, как у ls, но бо­лее под­роб­ный. До­ба­вим пра­в досту­па – этим вла­де­ет setfacl. Коман­ды

setfacl --modify group:project:rw имя­Фай­ла

getfacl имя­Фай­ла

да­ют сле­дую­щий ре­зуль­тат:

  1. file: имя­Фай­ла
  1. owner: nelz
  1. group: users

user::rw

group::r--

group:project:rw

mask::rw

other::r--

Па­ра­метр --modify (или -m) ве­лит setfacl из­менить спи­сок управ­ления досту­пом фай­ла, а group:project:rw опи­сы­ва­ет до­бав­ляе­мое пра­во досту­па. Оно со­сто­ит из трех час­тей, раз­де­лен­ных знаком :. Пер­вая – тип до­бав­ляе­мо­го пра­ва досту­па: поль­зо­ва­тель (user), груп­па (group) или осталь­ные (other), ана­ло­гич­но обыч­ным пра­вам досту­па. Вто­рая часть – имя поль­зо­ва­те­ля или груп­пы; ес­ли оста­вить его пустым, по умол­чанию ис­поль­зу­ет­ся груп­па или поль­зо­ва­тель, вла­деющие фай­лом, а для осталь­ных (other) оно всегда пусто. Тре­тья часть – при­ме­няе­мые пра­ва досту­па. В при­ме­ре мы до­бави­ли пра­ва на чтение и запись для всех чле­нов груп­пы project. Что­бы вы­пол­нять эти дей­ст­вия, не нуж­но быть ад­минист­ра­то­ром сис­те­мы root или поль­зо­вать­ся sudo. Спи­сок управ­ления досту­пом для фай­ла за­да­ет­ся вла­дель­цем фай­ла, и по­ка вы ра­бо­тае­те там, где у вас есть пра­ва досту­па на запись, вы мо­же­те соз­да­вать все необ­хо­ди­мые фай­лы и ка­та­ло­ги и за­пускать для них setfacl.

По­ка мы не сде­ла­ли ниче­го сверх обыч­ной вы­да­чи прав досту­па, но раз­ре­шения ACL мож­но соз­да­вать и для ка­та­ло­гов. А главное, для ка­та­ло­гов мож­но за­дать пра­ва досту­па по умол­чанию. Ес­ли сде­лать вла­дель­цем ка­та­ло­га груп­пу project и выдать ее на запись, то лю­бой член этой груп­пы смо­жет соз­дать в ка­та­ло­ге файл, но вла­дель­цем ка­ж­до­го фай­ла бу­дет он сам, и толь­ко у него бу­дут пра­ва на запись это­го фай­ла. За­да­вать пра­ва досту­па для ка­ж­до­го фай­ла очень нудно, по­это­му мож­но сде­лать сле­дую­щее:

mkdir Ка­та­лог

setfacl -m group:project:rwx Ка­та­лог

setfacl -m default:group:project:rwx Ка­та­лог

Пер­вый вы­зов setfacl, ана­ло­ги­чно прошло­му, да­ет груп­пе project пра­ва досту­па rwx на но­вый ка­та­лог. Во вто­ром вы­зо­ве в опи­сании ACL есть ­новый эле­мент – default, за­даю­щий пра­ва досту­па для вновь соз­дан­ных фай­лам/ка­та­ло­гам. Для вре­мен­но­го пе­ре­клю­чения поль­зо­ва­те­лей прим­еняет­ся sudo. Пусть Боб (bob) и Джим (jim) – поль­зо­ва­те­ли из груп­пы project. Ско­ман­дуй­те:

sudo -u bob touch Ка­та­лог/имя­Фай­ла

ls -l Ка­та­лог/имя­Фай­ла

getfacl Ка­та­лог/имя­Фай­ла

sudo -u jim nano Ка­та­лог/имя­Фай­ла

Так как файл имя­Фай­ла соз­да­ет bob, он яв­ля­ет­ся его вла­дель­цем, о чем со­об­ща­ет ко­ман­да ls. Setfacl по­ка­зы­ва­ет, что чле­ны груп­пы project мо­гут пи­сать дан­ные в этот файл, и за­пустив Nano от имени jim, вы уви­ди­те, что Джим и вправду мо­жет ре­дак­ти­ро­вать файл – для со­хранения из­менений на­жми­те Ctrl+X в Nano. Хо­тя вы ре­дак­ти­ро­ва­ли файл как дру­гой поль­зо­ва­тель, его вла­де­лец – все тот же Боб, как по­ка­жет ко­ман­да ls -l somedir.

Ра­бо­та с при­ме­ра­ми

Об­ра­ти­те внимание, что ес­ли ука­зать невер­ную груп­пу или имя поль­зо­ва­те­ля, setfacl вы­даст ошиб­ку, и ес­ли вы хо­ти­те по­ра­бо­тать с эти­ми при­ме­ра­ми, сто­ит соз­дать но­вую груп­пу и несколь­ких поль­зо­ва­те­лей. До­бавь­те поль­зо­ва­те­лей через ути­литы сво­его ди­ст­ри­бу­ти­ва или сде­лай­те это с тер­ми­на­ла ко­ман­да­ми:

sudo groupadd project

sudo useradd bob

sudo useradd jim

sudo gpasswd -a bob project

sudo gpasswd -a jim project

Ра­зо­брав­шись в при­ме­ра­х, «лиш­них» лю­дей мож­но уда­лить:

sudo userdel bob

sudo userdel jim

sudo groupdel project

Дру­гие па­ра­мет­ры

По­ка мы поль­зо­ва­лись толь­ко па­ра­мет­ром -m для до­бав­ления од­но­го ACL для фай­ла или ка­та­ло­га. Мож­но ука­зать и несколь­ко спи­сков, через за­пя­ты­е. Как и с па­ра­мет­ром --modify, обо­зна­чения default, user, group и other мож­но со­кра­тить до пер­вой бу­к­вы.

setfacl -m g:project:rwx,u:alice:rwx somedir

Эта ко­ман­да, как и пре­ж­де, да­ет пол­ный доступ всем чле­нам груп­пы project, а за­од­но да­ет доступ и поль­зо­ва­те­лю alice, да­же ес­ли она не член груп­пы project. Ес­ли у вас есть ти­по­вой на­бор ACL, ис­поль­зуе­мый в несколь­ких мес­тах, ска­жем, при ка­ж­дом соз­дании про­ек­та, их мож­но со­хранить в фай­ле, на­при­мер, project.acl –

group:project:rwx

default:group:project:rwx

user:alice:rwx

и по­том за­да­вать пра­ва дос­ту­па для лю­бо­го ка­та­ло­га ко­ман­дой

setfacl --modify-file project.acl somenewdir

У па­ра­мет­ров --modify и --modify-file (или -M) есть па­ра­мет­ры --remove и --remove-file (или -x и -X) для уда­ления ACL у фай­ла или ка­та­ло­га со­от­вет­ст­вен­но. С по­мо­щью этих че­ты­рех па­ра­мет­ров мож­но до­ба­вить или уда­лить ACL для фай­ла; так­же есть па­ра­мет­ры --set и --set-file, уста­нав­ли­ваю­щие за­дан­ные ACL, уда­ляя все су­ще­ст­вую­щие (у них нет со­кра­щен­но­го ва­ри­ан­та за­пи­си). Так­же мож­но пе­ре­на­пра­вить вы­вод getfacl на вход setfacl, тогда мы ско­пи­ру­ем ACL с од­но­го фай­ла на дру­гой.

getfacl oldfile | setfacl --set-file=- newfile

Сим­вол — по­сле set-file оз­на­ча­ет, что в ка­че­­ст­ве фай­ла ис­поль­зу­ет­ся стан­дарт­ный ввод, на ко­то­рый по­сту­па­ет вы­вод ко­ман­ды getfacl. О спи­сках управ­ления досту­пом мож­но рас­ска­зы­вать и да­лее, но для на­ча­ла это­го доста­точ­но. Ес­ли вам нуж­на до­полнитель­ная ин­фор­ма­ция, на man-страницах команд getfacl и setfacl при­ве­ден спи­сок всех па­ра­мет­ров и несколь­ко при­ме­ров. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика