به عنوان یک ادمین سیستم اولین اولویت ما باید محافظت و برقراری امنیت اطلاعات از دسترسی های غیر مجاز باشد. همه ما درباره پرمیژن ها و تعریف آنها با استفاده از دستورات لینوکسی مفیدی مانند chmod, chown و chgrp و غیره میدانیم. به هر حال این مجموعه پرمیژن های پیش فرض محدودیت هایی دارند و گاهی اوقات با توجه به نیاز ما کارایی ندارند. برای مثال ما نمیتوانیم مجموعه پرمیژن های متفاوتی برای کاربران متفاوت روی دایرکتوری یا فایل یکسان اعمال کنیم. بنابراین Access Control List (یا ACL) به کار برده میشوند.
همچنین توصیه میشود مقالات زیر را مطالعه کنید :
7 ابزار برای Encrypt/Decrypt و محافظت از فایل ها با استفاده از پسورد در لینوکس
ابزار LUKS برای Encrypt کردن Data روی هارد دیسک با فرمت NTFS در لینوکس
دستور chattr برای ایجاد فایل های مهم و غیر قابل تغییر در لینوکس
ابزار fswatch - مانیتور کردن تغییرات فایل ها و دایرکتوری ها در لینوکس
دستور lsof برای مشاهده لیست فایل های باز در لینوکس
چگونه بفهمیم در لینوکس چه کسی در حال استفاده از یک فایل است
فرض کنید 3 کاربر linuxzone1, linuxzone2 و linuxzone3 داریم و هر کدام از آنها گروه مشترکی به نام acl دارند. کاربر linuxzone1 میخواهد که تنها کاربر linuxzone2 بتواند به فایل هایش دسترسی و امکان read داشته باشد و هیچ کس دیگری چنین دسترسی به فایل های linuxzone1 نداشته باشند.
Access Control List به ما امکان انجام ترفند بالا را میدهد. این ACL ها امکان پرمیژن دادن برای یک کاربر، گروه و هر گروهی از از هر کاربرانی که در لیست گروه یک یوزر نیستند را فراهم میآورد.
توجه : با توجه به مستندات redhat این سیستم عامل برای فایل سیستم ext3 و فایل سیستم export شده NFS پشتیبانی ACL را فراهم آورده است.
چگونه پشتیبانی از ACL را روی سیستم های لینوکسی چک کنیم :
قبل از هر کاری باید از پشتیبانی acl روی کرنل موجود و فایل سیستم های mount شده مطمئن شویم :
1 - بررسی پشتیبانی کرنل از ACl :
برای بررسی پشتیبانی از ACL در فایل سیستم دستور زیر را اجرا کنید و گزینه POSIX_ACL=Y باشد. (اگر به جای Y گزینه N باشد این بدان معناست که کرنل از acl پشتیبانی نمیکند و نیاز به دوباره کامپایل شدن (recompile) دارد :
2 - بررسی پکیج های پیشنیاز :
قبل از شروع کار با acl از نصب پکیج های پیشنیاز مطمئن شوید. پکیج های زیر در حقیقت مواردیست که باید با استفاده از yum یا apt-get نصب شود :
3 - بررسی پشتیبانی فایل سیستم mount شده از ACL :
اکنون چک کنید که آیا فایل سیستم mount شده با آپشن acl مانت شده است یا خیر؟ میتوانیم با استفاده از دستور mount همانطور که در زیر مشاهده میکنید بررسی کنیم :
اما همانطور که در بالا میبینید به صورت پیش فرض acl نمایش داده نمیشود. بنابراین باید پارتیشن mount شده را بار دیگر با استفاده از اپشن acl مانت (remount) کنیم. اما قبل از آن باید مطمئن شویم که آیا پارتیشن با آپشن ACL مانت شده است یا خیر؟ زیر ممکن است با default mount option یکپارچه شده باشد :
در خروجی بالا شما میتوانید ببینید که default mount option از acl پشتیبانی میکند. گزینه دیگر همانطو که گفتیم دوباره mount کردن پارتیشن میباشد :
سپس خط زیر را به فایل /etc/fstab اضافه میکنیم تا پارتیشن همیشه mount باشد :
دوباره پارتیشن را remount میکنیم :
4 - در سرور NFS :
در سرور NFS اگر فایل سیستمی که توسط سرور NFS اکسپورت (export) شده باشد از acl پشتیبانی کند و acl بتواند توسط کلاینت های NFS خوانده شود در نتیجه acl توسط سیستم کلاینت مورد استفاده قرار میگیرد.
برای غیرفعال کردن acl روی NFS share شما باید آپشن no_acl را در فایل /etc/exportfs روی سرور NFS اضافه کنید. برای غیرفعال کردن آن رو کلاینت NFS هم باید دوباره آپشن no_acl را در طول مدت mount استفاده کنید.
چگونه پشتیبانی ACL در سیستم های لینوکسی پیاده سازی کنیم :
2 نوع acl وجود دارد :
1 - Access ACL : برای پرمیژن دادن به هرفایل یا پوشه ای مورد استفاده قرار میگیرد.
2 - Defult ACL : برای تعریف و دادن دسترسی روی یک دایرکتوری خاص استفاده میشود.
تفاوت بین Access ACL و Default ACL :
Default ACL میتواند تنها روی دایرکتوری ها اعمال شود.
هر زیر دایرکتوری یا فایلی که درون دایرکتوری اصلی ایجاد شود ACL را از دایرکتوری parent خود به ارث میبرد. به عبارت دیگر یک فایل Default ACL را به عنوان Access ACL خود به ارث میبرد.
ما برای تعریف Default ACL از آپشن -d استفاده میکنیم و در حقیقت کاملا optional و انتخابی میباشد.
قبل از تعریف Default ACL :
برای تعریف Default ACL برای یک فایل یا دایرکتوری خاص از دستور getfacl استفاده میشود. در مثال زیر getfacl برای دادن Default ACL به پوشه music استفاده شده است :
بعد از تعریف Default ACL :
برای تعریف Default ACL برای یک دایرکتوری یا فایل خاص از دستور setfacl استفاده میشود. در مثال زیر دستور setfacl یک acl جدید (read and execute) روی فولدر music تعریف خواهد کرد :
نحوه تعریف ACL جدید :
برای تعریف یا تغییر acl روی هر فایل یا دایرکتوری از دستور setfacl استفاده میشود. برای مثال برای دادن پرمیژن read و write به یوزر linuxzone1 باید دستور زیر را اجرا کنیم :
نحوه نمایش ACL ها :
برای نمایش acl روی هر فایل یا دایرکتوری از دستور getfacl استفاده میشود. برای مثال برای مشاهده acl روی /linuxzone1/example دستور زیر را اجرا کنید :
نحوه حذف ACL :
برای حذف acl از هر فایل یا دایرکتوری از آپشن های x و b استفاده میشود.
حذف تنها acl مشخص شده از فایل یا دایرکتوری :
حذف تمام acl ها از فایل یا دایرکتوری :
اکنون acl را روی سناریو زیر پیاده سازی میکنیم.
2 کاربر linuxzone1 و linuxzone2 هر دو گروه ثانویه مشترکی به نام acl دارند. ما یک پوشه با مالکیت linuxzone1 ایجاد کردیم و پرمیژن read و execute روی آن دایرکتوری را به یوزر linuxzone2 دادیم.
مرحله 1 : ایجاد 2 یوزر و حذف پسورد از هر 2 آنها
مرحله 2 : ایجاد یک گروه و دادن آن به عنوان گروه ثانویه به کاربران
مرحله 3 : ایجاد یک دایرکتوری با نام linuxzone1 و تغییر مالکیت آن به کاربر linuxzone1
مرحله 4 : login کردن با linuxzone1 و ایجاد یک دایرکتوری در پوشه linuxzone
مرحله 5 : تعریف ACL با استفاده از setfacl به طوری که linuxzone1 تمامی پرمیژن های rwx را داشته باشد و linuxzone2 تنها پرمیژن read روی پوشه example داشته و ما بقی هیچ پرمیژنی نداشته باشد.
مرحله 6 : اکنون با یوزر دیگری مانند linuxzone1 لاگین کنید و به دایرکتوری linuxzone1 وارد شوید. با استفاده از دستور ls سعی کنید محتویات دایرکتوری را ببینید سپس تلاش کنید به دایرکتوری example وارد شوید و تفاوت ها را مشاهده کنید :
مرحله 7 : اکنون پرمیژن execute به یوزر linuxzone2 روی پوشه example بدهید و سپس با استفاده از دستور cd به آن وارد شوید. اکنون linuxzone2 پرمیژن برای مشاهده و تغییر پوشه را دارد اما امکان write چیزی را ندارد :
توجه : بعد از پیاده سازی ACL در خروجی دستور ls -l یک نشانه اضافی + (مثبت) در مقابل پوشه مورد نظر خواهید دید :
همچنین توصیه میشود مقالات زیر را مطالعه کنید :
مدیریت کاربران، گروه ها، سطوح دسترسی و خصوصیت فایل ها در لینوکس
5 نمونه از بهترین روش ها برای امنیت و نگهداری سرورهای لینوکس
با آرزوی موفقیت ...
همچنین توصیه میشود مقالات زیر را مطالعه کنید :
7 ابزار برای Encrypt/Decrypt و محافظت از فایل ها با استفاده از پسورد در لینوکس
ابزار LUKS برای Encrypt کردن Data روی هارد دیسک با فرمت NTFS در لینوکس
دستور chattr برای ایجاد فایل های مهم و غیر قابل تغییر در لینوکس
ابزار fswatch - مانیتور کردن تغییرات فایل ها و دایرکتوری ها در لینوکس
دستور lsof برای مشاهده لیست فایل های باز در لینوکس
چگونه بفهمیم در لینوکس چه کسی در حال استفاده از یک فایل است
فرض کنید 3 کاربر linuxzone1, linuxzone2 و linuxzone3 داریم و هر کدام از آنها گروه مشترکی به نام acl دارند. کاربر linuxzone1 میخواهد که تنها کاربر linuxzone2 بتواند به فایل هایش دسترسی و امکان read داشته باشد و هیچ کس دیگری چنین دسترسی به فایل های linuxzone1 نداشته باشند.
Access Control List به ما امکان انجام ترفند بالا را میدهد. این ACL ها امکان پرمیژن دادن برای یک کاربر، گروه و هر گروهی از از هر کاربرانی که در لیست گروه یک یوزر نیستند را فراهم میآورد.
توجه : با توجه به مستندات redhat این سیستم عامل برای فایل سیستم ext3 و فایل سیستم export شده NFS پشتیبانی ACL را فراهم آورده است.
چگونه پشتیبانی از ACL را روی سیستم های لینوکسی چک کنیم :
قبل از هر کاری باید از پشتیبانی acl روی کرنل موجود و فایل سیستم های mount شده مطمئن شویم :
1 - بررسی پشتیبانی کرنل از ACl :
برای بررسی پشتیبانی از ACL در فایل سیستم دستور زیر را اجرا کنید و گزینه POSIX_ACL=Y باشد. (اگر به جای Y گزینه N باشد این بدان معناست که کرنل از acl پشتیبانی نمیکند و نیاز به دوباره کامپایل شدن (recompile) دارد :
کد:
[root@linux ~]# grep -i acl /boot/config* CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_JFS_POSIX_ACL=y CONFIG_XFS_POSIX_ACL=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y CONFIG_GENERIC_ACL=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_NFS_V3_ACL=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3_ACL=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_CIFS_ACL=y CONFIG_9P_FS_POSIX_ACL=y
2 - بررسی پکیج های پیشنیاز :
قبل از شروع کار با acl از نصب پکیج های پیشنیاز مطمئن شوید. پکیج های زیر در حقیقت مواردیست که باید با استفاده از yum یا apt-get نصب شود :
کد:
[root@linux ~]# yum install nfs4-acl-tools acl libacl [on [B]RedHat[/B] based systems]
کد:
[linuxzone@linux ~]$ sudo apt-get install nfs4-acl-tools acl [on [B]Debian[/B] based systems]
3 - بررسی پشتیبانی فایل سیستم mount شده از ACL :
اکنون چک کنید که آیا فایل سیستم mount شده با آپشن acl مانت شده است یا خیر؟ میتوانیم با استفاده از دستور mount همانطور که در زیر مشاهده میکنید بررسی کنیم :
کد:
[root@linux ~]# mount | grep -i root /dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)
کد:
[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl Default mount options: user_xattr acl
کد:
[root@linux ~]# mount -o remount,acl /
کد:
/dev/mapper/fedora-root / ext4 defaults,acl 1 1
دوباره پارتیشن را remount میکنیم :
کد:
[root@linux ~]# mount -o remount /
4 - در سرور NFS :
در سرور NFS اگر فایل سیستمی که توسط سرور NFS اکسپورت (export) شده باشد از acl پشتیبانی کند و acl بتواند توسط کلاینت های NFS خوانده شود در نتیجه acl توسط سیستم کلاینت مورد استفاده قرار میگیرد.
برای غیرفعال کردن acl روی NFS share شما باید آپشن no_acl را در فایل /etc/exportfs روی سرور NFS اضافه کنید. برای غیرفعال کردن آن رو کلاینت NFS هم باید دوباره آپشن no_acl را در طول مدت mount استفاده کنید.
چگونه پشتیبانی ACL در سیستم های لینوکسی پیاده سازی کنیم :
2 نوع acl وجود دارد :
1 - Access ACL : برای پرمیژن دادن به هرفایل یا پوشه ای مورد استفاده قرار میگیرد.
2 - Defult ACL : برای تعریف و دادن دسترسی روی یک دایرکتوری خاص استفاده میشود.
تفاوت بین Access ACL و Default ACL :
Default ACL میتواند تنها روی دایرکتوری ها اعمال شود.
هر زیر دایرکتوری یا فایلی که درون دایرکتوری اصلی ایجاد شود ACL را از دایرکتوری parent خود به ارث میبرد. به عبارت دیگر یک فایل Default ACL را به عنوان Access ACL خود به ارث میبرد.
ما برای تعریف Default ACL از آپشن -d استفاده میکنیم و در حقیقت کاملا optional و انتخابی میباشد.
قبل از تعریف Default ACL :
برای تعریف Default ACL برای یک فایل یا دایرکتوری خاص از دستور getfacl استفاده میشود. در مثال زیر getfacl برای دادن Default ACL به پوشه music استفاده شده است :
کد:
[root@linux ~]# getfacl Music/ # file: Music/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:group::r-x default:other::rw-
بعد از تعریف Default ACL :
برای تعریف Default ACL برای یک دایرکتوری یا فایل خاص از دستور setfacl استفاده میشود. در مثال زیر دستور setfacl یک acl جدید (read and execute) روی فولدر music تعریف خواهد کرد :
کد:
[root@linux ~]# setfacl -m d:o:rx Music/ [root@linux ~]# getfacl Music/ # file: Music/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:group::r-x default:other::r-x
نحوه تعریف ACL جدید :
برای تعریف یا تغییر acl روی هر فایل یا دایرکتوری از دستور setfacl استفاده میشود. برای مثال برای دادن پرمیژن read و write به یوزر linuxzone1 باید دستور زیر را اجرا کنیم :
کد:
# setfacl -m u:linuxzone1:rw /linuxzone1/example
نحوه نمایش ACL ها :
برای نمایش acl روی هر فایل یا دایرکتوری از دستور getfacl استفاده میشود. برای مثال برای مشاهده acl روی /linuxzone1/example دستور زیر را اجرا کنید :
کد:
# getfacl /linuxzone1/example # file: linuxzone1/example/ # owner: linuxzone1 # group: linuxzone1 user::rwx user:linuxzone1:rwx user:linuxzone1:r-- group::rwx mask::rwx other::---
نحوه حذف ACL :
برای حذف acl از هر فایل یا دایرکتوری از آپشن های x و b استفاده میشود.
حذف تنها acl مشخص شده از فایل یا دایرکتوری :
کد:
# setfacl -x ACL file/directory
حذف تمام acl ها از فایل یا دایرکتوری :
کد:
# setfacl -b file/directory
اکنون acl را روی سناریو زیر پیاده سازی میکنیم.
2 کاربر linuxzone1 و linuxzone2 هر دو گروه ثانویه مشترکی به نام acl دارند. ما یک پوشه با مالکیت linuxzone1 ایجاد کردیم و پرمیژن read و execute روی آن دایرکتوری را به یوزر linuxzone2 دادیم.
مرحله 1 : ایجاد 2 یوزر و حذف پسورد از هر 2 آنها
کد:
[root@linux ~]# for user in linuxzone1 linuxzone2 > do > useradd $user > passwd -d $user > done Removing password for user linuxzone1. passwd: Success Removing password for user linuxzone2. passwd: Success
مرحله 2 : ایجاد یک گروه و دادن آن به عنوان گروه ثانویه به کاربران
کد:
[root@linux ~]# groupadd acl [root@linux ~]# usermod -G acl linuxzone1 [root@linux ~]# usermod -G acl linuxzone2
مرحله 3 : ایجاد یک دایرکتوری با نام linuxzone1 و تغییر مالکیت آن به کاربر linuxzone1
کد:
[root@linux ~]# mkdir /linuxzone1 [root@linux ~]# chown linuxzone1 /linuxzone1/
کد:
[root@linux ~]# ls -ld /linuxzone1/ drwxr-xr-x 2 linuxzone1 root 4096 Apr 17 14:46 /linuxzone1/
کد:
[root@linux ~]# getfacl /linuxzone1 getfacl: Removing leading '/' from absolute path names # file: linuxzone1 # owner: linuxzone1 # group: root user::rwx group::r-x other::r-x
مرحله 4 : login کردن با linuxzone1 و ایجاد یک دایرکتوری در پوشه linuxzone
کد:
[linuxzone@linux ~]$ su - linuxzone1 Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
کد:
[linuxzone1@linux ~]$ cd /linuxzone1/ [linuxzone1@linux linuxzone1]$ mkdir example
کد:
[linuxzone1@linux linuxzone1]$ ll total 4 drwxrwxr-x 2 linuxzone1 linuxzone1 4096 Apr 17 14:50 example
کد:
[linuxzone1@linux linuxzone1]$ whoami linuxzone1
مرحله 5 : تعریف ACL با استفاده از setfacl به طوری که linuxzone1 تمامی پرمیژن های rwx را داشته باشد و linuxzone2 تنها پرمیژن read روی پوشه example داشته و ما بقی هیچ پرمیژنی نداشته باشد.
کد:
$ setfacl -m u:linuxzone1:rwx example/ $ setfacl -m u:linuxzone2:r-- example/ $ setfacl -m other:--- example/ $ getfacl example/ # file: example # owner: linuxzone1 # group: linuxzone1 user::rwx user:linuxzone1:rwx user:linuxzone2:r-- group::r-x mask::rwx other::---
مرحله 6 : اکنون با یوزر دیگری مانند linuxzone1 لاگین کنید و به دایرکتوری linuxzone1 وارد شوید. با استفاده از دستور ls سعی کنید محتویات دایرکتوری را ببینید سپس تلاش کنید به دایرکتوری example وارد شوید و تفاوت ها را مشاهده کنید :
کد:
[linuxzone@linux ~]$ su - linuxzone2 Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
کد:
[linuxzone2@linux ~]$ cd /linuxzone1/ [linuxzone2@linux linuxzone1]$ ls -lR example/ example/: total 0
کد:
[linuxzone2@linux linuxzone1]$ cd example/ [B]-bash: cd: example/: Permission denied[/B]
کد:
[linuxzone2@linux linuxzone1]$ getfacl example/ # file: example # owner: linuxzone1 # group: linuxzone1 user::rwx user:linuxzone1:rwx user:linuxzone2:r-- group::rwx mask::rwx other::---
مرحله 7 : اکنون پرمیژن execute به یوزر linuxzone2 روی پوشه example بدهید و سپس با استفاده از دستور cd به آن وارد شوید. اکنون linuxzone2 پرمیژن برای مشاهده و تغییر پوشه را دارد اما امکان write چیزی را ندارد :
کد:
[linuxzone1@linux linuxzone1]$ setfacl -m u:linuxzone2:r-x example/ [linuxzone1@linux linuxzone1]$ getfacl example/ # file: example # owner: linuxzone1 # group: linuxzone1 user::rwx user:linuxzone1:rwx user:linuxzone2:r-x group::rwx mask::rwx other::---
کد:
[linuxzone@linux ~]$ su - linuxzone2 Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
کد:
[linuxzone2@linux ~]$ cd /linuxzone1/ [linuxzone2@linux linuxzone1]$ cd example/ [linuxzone2@linux example]$ getfacl .
کد:
[linuxzone2@linux example]$ mkdir test [B]mkdir: cannot create directory ‘test’: Permission denied[/B]
کد:
[linuxzone2@linux example]$ touch test [B]touch: cannot touch ‘test’: Permission denied[/B]
توجه : بعد از پیاده سازی ACL در خروجی دستور ls -l یک نشانه اضافی + (مثبت) در مقابل پوشه مورد نظر خواهید دید :
کد:
[root@linux linuxzone1]# ll total 4 drwxrwx---+ 2 linuxzone1 linuxzone1 4096 Apr 17 17:01 example
همچنین توصیه میشود مقالات زیر را مطالعه کنید :
مدیریت کاربران، گروه ها، سطوح دسترسی و خصوصیت فایل ها در لینوکس
5 نمونه از بهترین روش ها برای امنیت و نگهداری سرورهای لینوکس
با آرزوی موفقیت ...
کامنت