/etc/apparmor.d/
ذخیرهسازی شده و شامل فهرستی از قوانین کنترل دسترسی هستند که منابع مختلف را برای هر برنامه مشخص میکنند. پروفایلها با استفاده از دستور apparmor_parser
کامپایل شده و درون کرنل قرار میگیرند. هر پروفایل تنها میتواند در یکی از حالتهای enforcing یا complaining بارگیری شود. اولی با توجه به خط مشی امنیتی، تلاشهای خرابکارانه را گزارش میدهد در صورتی که دومی اجباری در پیروی از خط مشی نداشته ولی فراخوانیهای سیستمی غیرمجاز را ذخیرهسازی میکند.
#
apt install apparmor apparmor-profiles apparmor-utils
[...] #
perl -pi -e 's,GRUB_CMDLINE_LINUX="(.*)"$,GRUB_CMDLINE_LINUX="$1 apparmor=1 security=apparmor",' /etc/default/grub
#
update-grub
aa-status
بررسی کرد:
#
aa-status
apparmor module is loaded. 44 profiles are loaded. 9 profiles are in enforce mode. /usr/bin/lxc-start /usr/lib/chromium-browser/chromium-browser//browser_java [...] 35 profiles are in complain mode. /sbin/klogd [...] 3 processes have profiles defined. 1 processes are in enforce mode. /usr/sbin/libvirtd (1295) 2 processes are in complain mode. /usr/sbin/avahi-daemon (941) /usr/sbin/avahi-daemon (1000) 0 processes are unconfined but have a profile defined.
aa-enforce
و aa-complain
به وضعیت enforcing و complaining تغییر یابد که اینکار به عنوان پارامتر در مسیر اجرایی برنامه یا مسیر فایل خطی مشی امنیتی صورت میپذیرد. به علاوه، یک پروفایل میتواند با استفاده از aa-disable
غیرفعال شده یا در حالت audit (برای ثبت فراخوانیهای سیستمی مجاز) با استفاده از aa-audit
قرار گیرد.
#
aa-enforce /usr/sbin/avahi-daemon
Setting /usr/sbin/avahi-daemon to enforce mode.
#
aa-complain /etc/apparmor.d/usr.bin.lxc-start
Setting /etc/apparmor.d/usr.bin.lxc-start to complain mode.
aa-unconfined
را فراهم میکند تا فهرستی از برنامههای تحت شبکه با سوکت باز که پروفایل مشخصی ندارند بدست آید. با گزینه --paranoid
شما فهرستی از تمام فرآیندهای تعریف نشده که حداقل یک ارتباط فعال شبکه را دارند دریافت میکنید.
#
aa-unconfined
801 /sbin/dhclient not confined 890 /sbin/rpcbind not confined 899 /sbin/rpc.statd not confined 929 /usr/sbin/sshd not confined 941 /usr/sbin/avahi-daemon confined by '/usr/sbin/avahi-daemon (complain)' 988 /usr/sbin/minissdpd not confined 1276 /usr/sbin/exim4 not confined 1485 /usr/lib/erlang/erts-6.2/bin/epmd not confined 1751 /usr/lib/erlang/erts-6.2/bin/beam.smp not confined 19592 /usr/lib/dleyna-renderer/dleyna-renderer-service not confined
/sbin/dhclient
ایجاد کنیم. برای این منظور از aa-genprof dhclient
استفاده میکنیم. این دستور از شما دعوت میکند تا از برنامه در پنجره دیگری استفاده کنید و زمانی که به پایان رسید به aa-genprof
بازگشته تا رویدادهای سیستمی مورد نظر AppArmor پیمایش شوند و از میان آنها قوانین دسترسی برنامه مشخص گردند. برای هر رویداد ثبت شده، یک یا چند پیشنهاد برای قانون مورد نظر ارائه میدهد که میتوانید تایید یا به روشهای دیگر آنها را ویرایش کنید:
#
aa-genprof dhclient
Writing updated profile for /sbin/dhclient. Setting /sbin/dhclient to complain mode. Before you begin, you may wish to check if a profile already exists for the application you wish to confine. See the following wiki page for more information: http://wiki.apparmor.net/index.php/Profiles Please start the application to be profiled in another window and exercise its functionality now. Once completed, select the "Scan" option below in order to scan the system logs for AppArmor events. For each AppArmor event, you will be given the opportunity to choose whether the access should be allowed or denied. Profiling: /sbin/dhclient [(S)can system log for AppArmor events] / (F)inish Reading log entries from /var/log/audit/audit.log. Profile: /sbin/dhclient Execute: /usr/lib/NetworkManager/nm-dhcp-helper Severity: unknown (I)nherit / (C)hild / (P)rofile / (N)amed / (U)nconfined / (X) ix On / (D)eny / Abo(r)t / (F)inish
P
Should AppArmor sanitise the environment when switching profiles? Sanitising environment is more secure, but some applications depend on the presence of LD_PRELOAD or LD_LIBRARY_PATH. (Y)es / [(N)o]Y
Writing updated profile for /usr/lib/NetworkManager/nm-dhcp-helper. Complain-mode changes: WARN: unknown capability: CAP_net_raw Profile: /sbin/dhclient Capability: net_raw Severity: unknown [(A)llow] / (D)eny / (I)gnore / Audi(t) / Abo(r)t / (F)inishA
Adding capability net_raw to profile. Profile: /sbin/dhclient Path: /etc/nsswitch.conf Mode: r Severity: unknown 1 - #include <abstractions/apache2-common> 2 - #include <abstractions/libvirt-qemu> 3 - #include <abstractions/nameservice> 4 - #include <abstractions/totem> [5 - /etc/nsswitch.conf] [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)ore3
Profile: /sbin/dhclient Path: /etc/nsswitch.conf Mode: r Severity: unknown 1 - #include <abstractions/apache2-common> 2 - #include <abstractions/libvirt-qemu> [3 - #include <abstractions/nameservice>] 4 - #include <abstractions/totem> 5 - /etc/nsswitch.conf [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)oreA
Adding #include <abstractions/nameservice> to profile. Profile: /sbin/dhclient Path: /proc/7252/net/dev Mode: r Severity: 6 1 - /proc/7252/net/dev [2 - /proc/*/net/dev] [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)oreA
Adding /proc/*/net/dev r to profile [...] Profile: /sbin/dhclient Path: /run/dhclient-eth0.pid Mode: w Severity: unknown [1 - /run/dhclient-eth0.pid] [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)oreN
Enter new path: /run/dhclient*.pid Profile: /sbin/dhclient Path: /run/dhclient-eth0.pid Mode: w Severity: unknown 1 - /run/dhclient-eth0.pid [2 - /run/dhclient*.pid] [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)oreA
Adding /run/dhclient*.pid w to profile [...] Profile: /usr/lib/NetworkManager/nm-dhcp-helper Path: /proc/filesystems Mode: r Severity: 6 [1 - /proc/filesystems] [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)oreA
Adding /proc/filesystems r to profile = Changed Local Profiles = The following local profiles were changed. Would you like to save them? [1 - /sbin/dhclient] 2 - /usr/lib/NetworkManager/nm-dhcp-helper (S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)tS
Writing updated profile for /sbin/dhclient. Writing updated profile for /usr/lib/NetworkManager/nm-dhcp-helper. Profiling: /sbin/dhclient [(S)can system log for AppArmor events] / (F)inishF
Setting /sbin/dhclient to enforce mode. Setting /usr/lib/NetworkManager/nm-dhcp-helper to enforce mode. Reloaded AppArmor profiles in enforce mode. Please consider contributing your new profile! See the following wiki page for more information: http://wiki.apparmor.net/index.php/Profiles Finished generating profile for /sbin/dhclient.
اولین رویداد تشخیص داده شده مربوط به اجرای برنامه دیگری است. در این مورد، شما چندین انتخاب دارید: میتوانید برنامه را با پروفایل فرآیند والد آن (گزینه “Inherit”)، با پروفایل اختصاصی خود (گزینههای “Profile” و “Named”، که تنها در شیوه گزینش نام تفاوت دارند)، با پروفایل زیرمجموعه فرآیند والد آن (گزینه “Child”)، بدون پروفایل (گزینه “Unconfined”) اجرا کنید یا میتوانید تصمیم بگیرید که برنامه اصلا اجرا نشود (گزینه “Deny”).
به یاد داشته باشید که در صورت انتخاب یک پروفایل اختصاصی و عدم وجود آن، این ابزار پروفایل جدید را برای شما ایجاد کرده و در همان قسمت قوانین پیشنهای را به شما ارائه میدهد.
| |
در سطح کرنل، قدرت ویژه کاربر root به چندین “قابلیت” تقسیم میشود. زمانی که یک فراخوانی سیستمی نیازمند ... خاصی است، AppArmor تایید میکند آیا پروفایل به برنامه اجازه استفاده از چنین قابلیتی را میدهد یا خیر.
| |
در اینجا برنامه به دنبال مجوزهای /etc/nsswitch.conf است. aa-genprof تشخیص داد که این مجوز توسط چندین “موجودیت” صادر شده و آنها را به عنوان گزینههای جایگزین پیشنهاد میدهد. یک موجودیت مجموعهای از قوانین دسترسی را فراهم میکند که این قوانین منابع مختلفی که معمولا با یکدیگر استفاده میشوند را گروهبندی میکنند. در این مورد بخصوص، فایل معمولا توسط nameservice مرتبط با توابع کتابخانهای C قابل دسترسی است و برای انتخاب گزینه “#include <abstractions/nameservice>” عبارت “3” را وارد کرده و با درج “A” آن را تایید میکنیم.
| |
برنامه قصد ایجاد فایل /run/dhclient-eth0.pid را دارد. اگر فقط اجازه ایجاد چنین فایل ویژهای را بدهیم، برنامه زمانی که کاربر از آن در یک رابط شبکه دیگر استفاده کند کار نخواهد کرد. بنابراین با انتخاب “New” نام فایل را به عبارت متداولتر “/run/dhclient*.pid” قبل از اینکه توسط “Allow” ثبت شود تغییر میدهیم.
| |
نکته اینکه این درخواست دسترسی قسمتی از پروفایل dhclient نبوده ولی در پروفایل جدید فراهم شده توسط /usr/lib/NetworkManager/nm-dhcp-helper در زمان اختصاص پروفایل ویژه به آن قرار دارد.
پس از بازرسی تمام رویدادهای ثبت شده، برنامه پیشنهاد میدهد که تمام پروفایلهای ایجاد شده در زمان اجرا ذخیرهسازی شوند. در این مورد، دو پروفایل داریم که به صورت همزمان با استفاده از “Save” میتوانیم ذخیرهسازی کنیم (اما امکان ذخیرهسازی انفرادی آنها نیز وجود دارد) قبل از اینکه برنامه را با “Finish” به پایان برسانیم.
|
aa-genprof
در حقیقت به عنوان یک لایه انتزاعی برای aa-logprof
عمل میکند: این ابزار یک پروفایل خالی ایجاد کرده، آن را در حالت complain قرار میدهد و با اجرای aa-logprof
، که ابزاری برای بروزرسانی پروفایل است، محتویات آن را مبتنی با رویدادهای ثبت شده در سیستم برورزسانی میکند. بنابراین در زمان دیگری میتوانید با اجرای این ابزار پروفایل خود را بهینهسازی کنید.
/etc/apparmor.d/sbin.dhclient
مشابه به این را دریافت کنید:
# Last Modified: Tue Sep 8 21:40:02 2015 #include <tunables/global> /sbin/dhclient { #include <abstractions/base> #include <abstractions/nameservice> capability net_bind_service, capability net_raw, /bin/dash r, /etc/dhcp/* r, /etc/dhcp/dhclient-enter-hooks.d/* r, /etc/dhcp/dhclient-exit-hooks.d/* r, /etc/resolv.conf.* w, /etc/samba/dhcp.conf.* w, /proc/*/net/dev r, /proc/filesystems r, /run/dhclient*.pid w, /sbin/dhclient mr, /sbin/dhclient-script rCx, /usr/lib/NetworkManager/nm-dhcp-helper Px, /var/lib/NetworkManager/* r, /var/lib/NetworkManager/*.lease rw, /var/lib/dhcp/*.leases rw, profile /sbin/dhclient-script flags=(complain) { #include <abstractions/base> #include <abstractions/bash> /bin/dash rix, /etc/dhcp/dhclient-enter-hooks.d/* r, /etc/dhcp/dhclient-exit-hooks.d/* r, /sbin/dhclient-script r, } }