ലിനക്സിൽ SELinux അല്ലെങ്കിൽ AppArmor ഉപയോഗിച്ച് നിർബന്ധിത ആക്സസ് നിയന്ത്രണം നടപ്പിലാക്കുന്നു


സ്റ്റാൻഡേർഡ് ugo/rwx അനുമതികളും ആക്സസ് കൺട്രോൾ ലിസ്റ്റുകളും നൽകുന്ന സുരക്ഷാ സംവിധാനങ്ങളുടെ പരിമിതികൾ മറികടക്കുന്നതിനും വർദ്ധിപ്പിക്കുന്നതിനും, യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് നാഷണൽ സെക്യൂരിറ്റി ഏജൻസി (NSA) അറിയപ്പെടുന്ന ഒരു ഫ്ലെക്സിബിൾ നിർബന്ധിത ആക്സസ് കൺട്രോൾ (MAC) രീതി ആവിഷ്കരിച്ചു. SELinux (സെക്യൂരിറ്റി എൻഹാൻസ്uഡ് ലിനക്uസിന്റെ ചുരുക്കം) ആയി, സിസ്റ്റം ഒബ്uജക്uറ്റുകളിൽ (ഫയലുകൾ, ഡയറക്uടറികൾ, നെറ്റ്uവർക്ക് പോർട്ടുകൾ മുതലായവ) ആക്uസസ് ചെയ്യാനോ മറ്റ് പ്രവർത്തനങ്ങൾ നടത്താനോ ഉള്ള പ്രോസസുകളുടെ കഴിവ്, സാധ്യമായ ഏറ്റവും കുറഞ്ഞ അനുമതിയിൽ, ഈ മോഡലിൽ പിന്നീട് മാറ്റങ്ങൾ വരുത്താൻ അനുവദിക്കുന്നു.

മറ്റൊരു ജനപ്രിയവും വ്യാപകമായി ഉപയോഗിക്കുന്നതുമായ MAC ആണ് AppArmor, അതിൽ SELinux നൽകുന്ന സവിശേഷതകൾക്ക് പുറമേ, ഒരു പ്രത്യേക ആപ്ലിക്കേഷൻ എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്ന് \പഠിക്കുന്നതിനും സുരക്ഷിതമായ ആപ്ലിക്കേഷൻ ഉപയോഗത്തിനായി പ്രൊഫൈലുകൾ ക്രമീകരിച്ചുകൊണ്ട് പരിധികൾ ക്രമീകരിക്കുന്നതിനും സിസ്റ്റത്തെ അനുവദിക്കുന്ന ഒരു ലേണിംഗ് മോഡ് ഉൾപ്പെടുന്നു. .

CentOS 7-ൽ, SELinux കേർണലിൽ തന്നെ സംയോജിപ്പിച്ചിരിക്കുന്നു, കൂടാതെ AppArmor ഉപയോഗിക്കുന്ന openSUSE, Ubuntu എന്നിവയ്uക്ക് വിരുദ്ധമായി സ്ഥിരസ്ഥിതിയായി എൻഫോഴ്uസിംഗ് മോഡിൽ പ്രവർത്തനക്ഷമമാക്കുന്നു (ഇതിനെക്കുറിച്ച് കൂടുതൽ അടുത്ത വിഭാഗത്തിൽ).

ഈ ലേഖനത്തിൽ SELinux, AppArmor എന്നിവയുടെ അവശ്യകാര്യങ്ങളും നിങ്ങൾ തിരഞ്ഞെടുത്ത വിതരണത്തെ ആശ്രയിച്ച് നിങ്ങളുടെ പ്രയോജനത്തിനായി ഈ ടൂളുകളിൽ ഒന്ന് എങ്ങനെ ഉപയോഗിക്കാമെന്നും ഞങ്ങൾ വിശദീകരിക്കും.

SELinux-ലേക്കുള്ള ആമുഖവും CentOS 7-ൽ അത് എങ്ങനെ ഉപയോഗിക്കാം

സുരക്ഷ മെച്ചപ്പെടുത്തിയ ലിനക്സിന് രണ്ട് വ്യത്യസ്ത രീതികളിൽ പ്രവർത്തിക്കാൻ കഴിയും:

  1. നിർവ്വഹിക്കുന്നു: സെക്യൂരിറ്റി എഞ്ചിനെ നിയന്ത്രിക്കുന്ന ഒരു കൂട്ടം മാർഗ്ഗനിർദ്ദേശങ്ങളായ SELinux നയ നിയമങ്ങളെ അടിസ്ഥാനമാക്കിയുള്ള ആക്uസസ് SELinux നിരസിക്കുന്നു.
  2. അനുവദനീയം: SELinux ആക്uസസ്സ് നിരസിക്കുന്നില്ല, എന്നാൽ എൻഫോഴ്uസിംഗ് മോഡിൽ പ്രവർത്തിക്കുകയാണെങ്കിൽ നിരസിക്കപ്പെടുമായിരുന്ന പ്രവർത്തനങ്ങൾക്കായി നിഷേധങ്ങൾ ലോഗ് ചെയ്uതിരിക്കുന്നു.

SELinux പ്രവർത്തനരഹിതമാക്കാനും കഴിയും. ഇത് ഒരു ഓപ്പറേഷൻ മോഡ് അല്ലെങ്കിലും, ഇത് ഇപ്പോഴും ഒരു ഓപ്ഷനാണ്. എന്നിരുന്നാലും, ഈ ഉപകരണം എങ്ങനെ ഉപയോഗിക്കണമെന്ന് പഠിക്കുന്നത് അത് അവഗണിക്കുന്നതിനേക്കാൾ നല്ലതാണ്. മനസ്സിൽ സൂക്ഷിക്കുക!

SELinux-ന്റെ നിലവിലെ മോഡ് പ്രദർശിപ്പിക്കുന്നതിന്, getenforce ഉപയോഗിക്കുക. നിങ്ങൾക്ക് ഓപ്പറേഷൻ മോഡ് ടോഗിൾ ചെയ്യണമെങ്കിൽ, setenforce 0 (അത് അനുവദനീയമായി സജ്ജമാക്കാൻ) അല്ലെങ്കിൽ setenforce 1 (എൻഫോഴ്സിംഗ്) ഉപയോഗിക്കുക.

ഈ മാറ്റം ഒരു റീബൂട്ടിനെ അതിജീവിക്കില്ല എന്നതിനാൽ, നിങ്ങൾ /etc/selinux/config ഫയൽ എഡിറ്റ് ചെയ്യുകയും SELINUX വേരിയബിൾ enforcing, permissive, അല്ലെങ്കിൽ എന്നിങ്ങനെ സജ്ജമാക്കുകയും വേണം. റീബൂട്ടുകളിലുടനീളം സ്ഥിരത കൈവരിക്കുന്നതിന് >അപ്രാപ്തമാക്കി:

ഒരു വശത്ത് കുറിപ്പിൽ, getenforce അപ്രാപ്തമാക്കി നൽകുകയാണെങ്കിൽ, നിങ്ങൾക്ക് ആവശ്യമുള്ള പ്രവർത്തന മോഡ് ഉപയോഗിച്ച് /etc/selinux/config എഡിറ്റ് ചെയ്ത് റീബൂട്ട് ചെയ്യേണ്ടിവരും. അല്ലെങ്കിൽ, നിങ്ങൾക്ക് setenforce ഉപയോഗിച്ച് പ്രവർത്തന മോഡ് സജ്ജമാക്കാൻ (അല്ലെങ്കിൽ ടോഗിൾ ചെയ്യാൻ) കഴിയില്ല.

setenforce ന്റെ സാധാരണ ഉപയോഗങ്ങളിലൊന്ന്, തെറ്റായി പെരുമാറുന്നതോ പ്രതീക്ഷിച്ച രീതിയിൽ പ്രവർത്തിക്കാത്തതോ ആയ ഒരു ആപ്ലിക്കേഷന്റെ ട്രബിൾഷൂട്ട് ചെയ്യുന്നതിനായി SELinux മോഡുകൾക്കിടയിൽ ടോഗിൾ ചെയ്യുന്നതാണ് (നിർവഹണത്തിൽ നിന്ന് അനുവദനീയമായതോ അല്ലെങ്കിൽ മറ്റ് വഴികളിലേക്കോ). നിങ്ങൾ SELinux പെർമിസീവ് മോഡിലേക്ക് സജ്ജീകരിച്ചതിന് ശേഷം ഇത് പ്രവർത്തിക്കുന്നുവെങ്കിൽ, നിങ്ങൾ ഒരു SELinux അനുമതികളുടെ പ്രശ്നമാണ് നോക്കുന്നതെന്ന് നിങ്ങൾക്ക് ഉറപ്പിക്കാം.

SELinux-നെ നേരിടേണ്ടിവരുന്ന രണ്ട് ക്ലാസിക് കേസുകൾ ഇവയാണ്:

  1. ഒരു ഡെമൺ കേൾക്കുന്ന ഡിഫോൾട്ട് പോർട്ട് മാറ്റുന്നു.
  2. /var/www/html-ന് പുറത്തുള്ള ഒരു വെർച്വൽ ഹോസ്റ്റിനായി DocumentRoot നിർദ്ദേശം സജ്ജമാക്കുന്നു.

ഇനിപ്പറയുന്ന ഉദാഹരണങ്ങൾ ഉപയോഗിച്ച് ഈ രണ്ട് കേസുകൾ നോക്കാം.

മിക്ക സിസ്റ്റം അഡ്മിനിസ്ട്രേറ്റർമാരും അവരുടെ സെർവറുകൾ സുരക്ഷിതമാക്കാൻ ആദ്യം ചെയ്യുന്ന ഒരു കാര്യം, SSH ഡെമൺ കേൾക്കുന്ന പോർട്ട് മാറ്റുക എന്നതാണ്, കൂടുതലും പോർട്ട് സ്കാനറുകളെയും ബാഹ്യ ആക്രമണകാരികളെയും നിരുത്സാഹപ്പെടുത്താൻ. ഇത് ചെയ്യുന്നതിന്, ഞങ്ങൾ /etc/ssh/sshd_config എന്നതിലെ പോർട്ട് ഡയറക്uടീവും തുടർന്ന് പുതിയ പോർട്ട് നമ്പറും ഇനിപ്പറയുന്ന രീതിയിൽ ഉപയോഗിക്കുന്നു (ഈ സാഹചര്യത്തിൽ ഞങ്ങൾ പോർട്ട് 9999 ഉപയോഗിക്കും):

Port 9999

സേവനം പുനരാരംഭിക്കാൻ ശ്രമിച്ച് അതിന്റെ നില പരിശോധിച്ചതിന് ശേഷം അത് ആരംഭിക്കുന്നതിൽ പരാജയപ്പെട്ടതായി ഞങ്ങൾ കാണും:

# systemctl restart sshd
# systemctl status sshd

നമ്മൾ /var/log/audit/audit.log പരിശോധിച്ചാൽ, SELinux പോർട്ട് 9999-ൽ ആരംഭിക്കുന്നതിൽ നിന്ന് sshd തടഞ്ഞതായി നമുക്ക് കാണാം, കാരണം അത് JBoss മാനേജ്uമെന്റ് സേവനത്തിനായി റിസർവ് ചെയ്uത പോർട്ട് ആണ് (SELinux ലോഗ് സന്ദേശങ്ങളിൽ എന്ന വാക്ക് ഉൾപ്പെടുന്നു. AVC അതുവഴി മറ്റ് സന്ദേശങ്ങളിൽ നിന്ന് എളുപ്പത്തിൽ തിരിച്ചറിയാൻ കഴിയും):

# cat /var/log/audit/audit.log | grep AVC | tail -1

ഈ സമയത്ത് മിക്ക ആളുകളും SELinux അപ്രാപ്uതമാക്കും, പക്ഷേ ഞങ്ങൾ ചെയ്യില്ല. SELinux-നും sshd-നും മറ്റൊരു പോർട്ടിൽ ശ്രവിക്കുന്നവർക്കും ഒരുമിച്ചു ജീവിക്കാൻ ഒരു വഴിയുണ്ടെന്ന് ഞങ്ങൾ കാണും. നിങ്ങൾ policycoreutils-python പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പുവരുത്തി പ്രവർത്തിപ്പിക്കുക:

# yum install policycoreutils-python

SELinux sshd-നെ കേൾക്കാൻ അനുവദിക്കുന്ന പോർട്ടുകളുടെ ഒരു ലിസ്റ്റ് കാണുന്നതിന്. ഇനിപ്പറയുന്ന ചിത്രത്തിൽ പോർട്ട് 9999 മറ്റൊരു സേവനത്തിനായി റിസർവ് ചെയ്uതിരിക്കുന്നതായും നമുക്ക് കാണാൻ കഴിയും, അതിനാൽ തൽക്കാലം മറ്റൊരു സേവനം പ്രവർത്തിപ്പിക്കാൻ ഞങ്ങൾക്ക് ഇത് ഉപയോഗിക്കാൻ കഴിയില്ല:

# semanage port -l | grep ssh

തീർച്ചയായും ഞങ്ങൾക്ക് SSH-നായി മറ്റൊരു പോർട്ട് തിരഞ്ഞെടുക്കാം, എന്നാൽ JBoss-മായി ബന്ധപ്പെട്ട ഏതെങ്കിലും സേവനങ്ങൾക്കായി ഈ നിർദ്ദിഷ്ട മെഷീൻ ഉപയോഗിക്കേണ്ടതില്ലെന്ന് ഞങ്ങൾക്ക് ഉറപ്പുണ്ടെങ്കിൽ, നിലവിലുള്ള SELinux റൂൾ പരിഷ്കരിച്ച് പകരം SSH-ന് ആ പോർട്ട് നൽകാം:

# semanage port -m -t ssh_port_t -p tcp 9999

അതിനുശേഷം, പോർട്ട് ശരിയായി അസൈൻ ചെയ്uതിട്ടുണ്ടോ എന്ന് പരിശോധിക്കാൻ നമുക്ക് ആദ്യത്തെ സെമനേജ് കമാൻഡ് ഉപയോഗിക്കാം, അല്ലെങ്കിൽ -lC ഓപ്ഷനുകൾ (ലിസ്റ്റ് കസ്റ്റം എന്നതിന്റെ ചുരുക്കം):

# semanage port -lC
# semanage port -l | grep ssh

നമുക്ക് ഇപ്പോൾ SSH പുനരാരംഭിച്ച് പോർട്ട് 9999 ഉപയോഗിച്ച് സേവനത്തിലേക്ക് കണക്റ്റുചെയ്യാനാകും. ഈ മാറ്റം ഒരു റീബൂട്ടിനെ അതിജീവിക്കും എന്നത് ശ്രദ്ധിക്കുക.

DocumentRoot ആയി /var/www/html അല്ലാത്ത ഒരു ഡയറക്uടറി ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഒരു Apache വെർച്വൽ ഹോസ്റ്റ് സജ്ജീകരിക്കണമെങ്കിൽ (ഉദാഹരണത്തിന്, /websrv/sites/gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

index.html default_t SELinux തരത്തിൽ ലേബൽ ചെയ്uതിരിക്കുന്നതിനാൽ ഉള്ളടക്കം നൽകാൻ Apache വിസമ്മതിക്കും, അത് Apache-ന് ആക്uസസ് ചെയ്യാൻ കഴിയില്ല:

# wget http://localhost/index.html
# ls -lZ /websrv/sites/gabriel/public_html/index.html

മുമ്പത്തെ ഉദാഹരണം പോലെ, ഇത് തീർച്ചയായും ഒരു SELinux-മായി ബന്ധപ്പെട്ട പ്രശ്നമാണോ എന്ന് പരിശോധിക്കാൻ നിങ്ങൾക്ക് ഇനിപ്പറയുന്ന കമാൻഡ് ഉപയോഗിക്കാം:

# cat /var/log/audit/audit.log | grep AVC | tail -1

/websrv/sites/gabriel/public_html എന്നതിന്റെ ലേബൽ ആവർത്തിച്ച് httpd_sys_content_t എന്നതിലേക്ക് മാറ്റാൻ, ചെയ്യുക:

# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

മുകളിലെ കമാൻഡ് ആ ഡയറക്uടറിയിലേക്കും അതിലെ ഉള്ളടക്കങ്ങളിലേക്കും അപ്പാച്ചെ റീഡ്-ഓൺലി ആക്uസസ് അനുവദിക്കും.

അവസാനമായി, നയം പ്രയോഗിക്കുന്നതിന് (ലേബൽ മാറ്റം ഉടനടി പ്രാബല്യത്തിൽ വരുത്തുന്നതിന്), ചെയ്യുക:

# restorecon -R -v /websrv/sites/gabriel/public_html

ഇപ്പോൾ നിങ്ങൾക്ക് ഡയറക്ടറി ആക്സസ് ചെയ്യാൻ കഴിയും:

# wget http://localhost/index.html

SELinux-നെ കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, Fedora 22 SELinux ഉം അഡ്മിനിസ്ട്രേറ്റർ ഗൈഡും കാണുക.