لینوکس بدون شک یک سیستم چندکاربره حقیقی است، پس فراهم کردن یک سیستم محوز برای کنترل عملیات مورد مجاز روی فایلها و دایرکتوریها، که شامل تمام منابع و دستگاههای سیستم میشود، امری لازم و ضروری است (در یک سیستم یونیکس، هر دستگاهی توسط یک فایل یا دایرکتوری مشحص میگردد). این اصل درباره تمام سیستمهای یونیکس صدق میکند، اما ذکر این نکته مفید است که کاربردهای پیشرفته دیگری نیز برای این منظور وجود دارند.
9.3.1. Owners and Permissions
هر فایل یا دایرکتوری شامل مجوزهای مشخصی برای سه گروه از کاربران است:
مالک آن (که با حرف u
از کلمه “user” نمایش مییابد)؛
گروه مالک آن (که با حرف g
از کلمه “group” نمایش مییابد) که بیانگر تمام اعضای آن گروه است؛
دیگران (که با حرف o
از کلمه “other” نمایش مییابد).
Three basic types of rights can be combined:
خواندن (که با خرف r
از کلمه “read” نمایش مییابد)؛
نوشتن یا تغییردادن (که با حرف w
از کلمه “write” نمایش مییابد).
اجرا کردن (که با حرف x
از کلمه “eXecute” نمایش مییابد).
در مورد یک فایل این دسترسیها به سادگی قابل درک هستند: دسترسی خواندن اجازه خواندن محتوا را میدهد (از جمله رونوشت گرفتن)، دسترسی نوشتن اجازه تغییر آن را میدهد و دسترسی اجراکردن اجازه اجرای فایل را میدهد (که در صورت برنامه بودن معنی دارد).
یک دایرکتوری به شیوه متفاوتی مدیریت میشود. دسترسی خواندن اجازه فهرستگیری از محتوای آن را میدهد (فایلها و دایرکتوریها)، دسترسی نوشتن اجازه ایجاد یا حذف فایلها را میدهد و دسترسی اجرا کردن اجازه عبور و مرور از دایرکتوری را میدهد (به خصوص هنگام استفاده از دستور cd
). توانایی عبور از یک دایرکتوری بدون آنکه قادر باشیم محتوای آن را بخوانیم اجازه دسترسی به موارد شناخته شده در آن را میدهد، اما در صورتی که نام یا محل فایل را ندانیم نمیتوان آنها را پیدا کرد.
سه دستور وجود دارند که مجوزهای مربوط به یک فایل را کنترل میکنند:
chown user file
مالک فایل را تغییر میدهد؛
chgrp group file
گروه مالک را تغییر میدهد؛
chmod rights file
مجوزهای مربوط به فایل را تغییر میدهد.
دو روش برای ارائه دسترسیها وجود دارد. از میان آنها، شیوه نمادین به سادگی فرا گرفته و آموخته میشود. این شیوه شامل حروف نمادین ذکر شده در بالا هستند. میتوانید برای هر دستهبندی از کاربران (u
/g
/o
) دسترسی تعیین کنید با تنظیم آنها به صورت انفرادی (با =
)، با افزودن (+
) یا کاستن (-
). بنابراین فرمول u=rwx,g+rw,o-r
به مالک فایل دسترسی خواندن، نوشتن و اجراکردن، به گروه مالک دسترسی خواندن و نوشتن و دسترسی خواندن را از سایر افراد میگیرد. دسترسیهایی که در چنین دستوری ذکر نشده باشند بدون تغییر باقی میمانند. حرف a
، به معنی “all”، تمام دستهبندیهای کاربران را شامل میشود. بنابراین، a=rx
به سه دستهبندی موجود تمام دسترسیها را (خواندن و اجراکردن، ولی نه نوشتن) میدهد.
نمایش عددی (اوکتال) هر دسترسی را به یک عدد نسبت میدهد: ۴ برای خواندن، ۲ برای نوشتن و ۱ برای اجراکردن. ترکیب دسترسیهای یک گروه را با جمع اعداد آن به دست میآوریم. هر مقدار به دستهبندیهای مختلف کاربران نسبت داده میشود درست به همان ترتیبی که قرار دارند (مالک، گروه و دیگران).
For instance, the chmod 754 file
command will set the following rights: read, write and execute for the owner (since 7 = 4 + 2 + 1); read and execute for the group (since 5 = 4 + 1); read-only for others. The 0
(zero) means no rights; thus chmod 600 file
allows for read/write rights for the owner, and no rights for anyone else. The most frequent right combinations are 755
for executable files and directories, and 644
for data files.
برای نمایش دسترسیهای ویژه، میتوانید یک عدد چهارم نیز به قبل از آن اضافه کنید که بیتهای setuid
، setgid
و sticky
به ترتیب نشانگر ۴ و ۲ و ۱ هستند. دستور chmod 4754
بیت setuid
را به همراه دسترسیهای موجود اضافه میکند.
نکته اینکه استفاده از شیوه عددی برای تنظیم تمام دسترسیها بکار میرود؛ پس نمیتوانید از آن برای افزودن تنها یک دسترسی، مانند دسترسی خواندن برای گروه مالک، استفاده کنید چرا که باید تمام دسترسیهای موجود و اعداد مربوط به آنها را نیز به حساب بیاورید.
9.3.2. ACLs - Access Control Lists
Many filesystems, e.g. Btrfs, Ext3, Ext4, JFS, XFS, etc., support the use of Access Control Lists (ACLs). These extend the basic features of file ownership and permission, described in the previous section, and allow for a more fine-grained control of each (file) object. For example: A user wants to share a file with another user and that user should only be able to read the file, but not write or change it.
For some of the filesystems, the usage of ACLs is enabled by default (e.g. Btrfs, Ext3, Ext4). For other filesystems or older systems it must be enabled using the acl
mount option - either in the mount
command directly or in /etc/fstab
. In the same way the usage of ACLs can be disabled by using the noacl
mount option. For Ext* filesystems one can also use the tune2fs -o [no]acl /dev/device
command to enable/disable the usage of ACLs by default. The default values for each filesystem can usually be found in their homonym manual pages in section 5 (filesystem(5)) or in mount(8).
After enabling ACLs, permissions can be set using the setfacl(1) command, while getfacl(1) allows one to retrieve the ACLs for a given object or path. These commands are part of the acl package. With setfacl
one can also configure newly created files or directories to inherit permissions from the parent directory. It is important to note that ACLs are processed in their order and that an earlier entry that fits the situation has precedence over later entries.
If a file has ACLs set, the output of the ls -l
command will show a plus-sign after the traditional permissions. When using ACLs, the chmod
command behaves slightly different, and umask
might be ignored. The extensive documentation, e.g. acl(5) contains more information.