லினக்ஸில் கோப்பு அனுமதிகள்

அனைவருக்கும் வணக்கம். நாங்கள் தீவிரமாக பணியில் ஈடுபட்டு வருகிறோம், ஏற்கனவே ஜனவரியில் பல சக்திவாய்ந்த துவக்கங்களைத் தயாரித்து வருகிறோம். மற்றவற்றுடன், அனைவருக்கும் பிடித்த பாடத்திட்டத்தின் புதிய ஸ்ட்ரீமைக்கான சேர்க்கை அறிவிக்கப்பட்டுள்ளது. "லினக்ஸ் நிர்வாகி". வெளியீட்டை எதிர்பார்த்து, பாரம்பரியமாக பயனுள்ள பொருள்களின் மொழிபெயர்ப்புகளைப் பகிர்ந்து கொள்கிறோம்.

லினக்ஸில் கோப்பு அனுமதிகள்

கோப்பு அனுமதிகள் SUID இயங்கக்கூடியவற்றுக்கு பாதுகாப்பான மாற்றீட்டை வழங்குகின்றன, ஆனால் முதலில் கொஞ்சம் குழப்பமாகத் தோன்றலாம்.


பைனரிகள் என்பதை நாம் அனைவரும் அறிவோம் தெற்கு அவை பாதுகாப்புக் கண்ணோட்டத்தில் தவறான முடிவு. அதிர்ஷ்டவசமாக, உங்கள் பயன்பாட்டிற்கு சில வரையறுக்கப்பட்ட சலுகைகள் தேவைப்பட்டால், மிகவும் திறமையான வழி உள்ளது கோப்பு அனுமதிகள்.

மேலே உள்ள கட்டுரையை நீங்கள் விரிவாகப் படிப்பதைத் தவிர்க்க விரும்பினால், நான் உங்களுக்குச் சிறிது நேரத்தைச் சேமிப்பேன்: அடிப்படையில், கோப்பு அனுமதிகள் ரூட்டாக இயங்கும் செயல்முறைகளை அனுமதிக்கின்றன, எனவே சில திறன்களைத் தக்கவைக்க ஏதாவது செய்ய அனுமதிக்கப்படுகின்றன, வரையறுக்கப்பட்டவை இந்த பட்டியல்அவர்கள் சலுகைகளை கைவிட்டு, சலுகை இல்லாத பயனரால் இயக்கப்படும் போது. இதன் பொருள், தாக்குபவர் இடையக வழிதல் அல்லது பிற சுரண்டலைப் பயன்படுத்தி ஒரு செயல்முறையை சமரசம் செய்ய முடிந்தால், செயல்முறைக்கு உண்மையில் தேவைப்படும் சில குறைந்தபட்ச சலுகைகளைத் தவிர வேறு எதையும் அவர்களால் பயன்படுத்த முடியாது.

எப்போதும் ரூட்டாக இயங்கும் சேவைகளுக்கு அனுமதிகள் சிறந்தவை, ஆனால் கட்டளை வரி பயன்பாடுகள் பற்றி என்ன? அதிர்ஷ்டவசமாக, நீங்கள் சரியான பயன்பாடுகளை நிறுவியிருந்தால் இதுவும் ஆதரிக்கப்படும். நீங்கள் உபுண்டுவைப் பயன்படுத்துகிறீர்கள் என்றால், உதாரணமாக உங்களுக்கு தொகுப்பு தேவைப்படும் libcap2-bin. நீங்கள் தொன்மையற்ற கர்னலையும் இயக்க வேண்டும் (பதிப்பிலிருந்து 2.6.24).

இந்த செயல்பாடுகள் SUID பிட்டை அமைப்பது போன்ற இயங்கக்கூடிய கோப்புகளுடன் அனுமதிகளை இணைக்க அனுமதிக்கின்றன, ஆனால் ஒரு குறிப்பிட்ட அனுமதிகளுக்கு மட்டுமே. பயன்பாடு setcap ஒரு கோப்பிலிருந்து அனுமதிகளைச் சேர்க்க மற்றும் அகற்ற பயன்படுகிறது.

உங்களுக்கு தேவையான அனுமதிகளைத் தேர்ந்தெடுப்பது முதல் படி. இந்த கட்டுரையின் பொருட்டு, நெட்வொர்க் கண்டறியும் கருவி என்று அழைக்கப்படும் என்று நான் கருதுகிறேன் tracewalk, பயன்படுத்தக்கூடியதாக இருக்க வேண்டும் மூல சாக்கெட்டுகள். இதற்கு வழக்கமாக பயன்பாட்டை ரூட்டாக இயக்க வேண்டும், ஆனால் பார்க்கும் போது பட்டியல் அனுமதி மட்டுமே தேவை என்று மாறிவிடும் CAP_NET_RAW.

பைனரி அமைந்துள்ள கோப்பகத்தில் நீங்கள் இருக்கிறீர்கள் என்று வைத்துக்கொள்வோம் tracewalk, இந்த அனுமதியை இப்படி சேர்க்கலாம்:

sudo setcap cap_net_raw=eip tracewalk

இப்போதைக்கு பின்னொட்டைப் புறக்கணிக்கவும் =eip தீர்வுக்காக, நான் அதைப் பற்றி ஓரிரு வினாடிகளில் பேசுவேன். அனுமதியின் பெயர் சிறிய எழுத்தில் உள்ளது என்பதை நினைவில் கொள்ளவும். நீங்கள் அனுமதிகளை சரியாக உள்ளமைத்துள்ளீர்களா என்பதை இப்போது நீங்கள் சரிபார்க்கலாம்:

setcap -v cap_new_raw=eip tracewalk

அல்லது கொடுக்கப்பட்ட இயங்கக்கூடியவற்றுக்கான அனைத்து அனுமதிகளையும் நீங்கள் பட்டியலிடலாம்:

getcap tracewalk

குறிப்புக்கு, நீங்கள் இயங்கக்கூடியவற்றிலிருந்து அனைத்து அனுமதிகளையும் நீக்கலாம்:

setcap -r tracewalk

இந்த கட்டத்தில், நீங்கள் இயங்கக்கூடிய செயலியை ஒரு சலுகையற்ற பயனராக இயக்க முடியும், மேலும் அது மூல சாக்கெட்டுகளுடன் வேலை செய்ய முடியும், ஆனால் ரூட் பயனருக்கு இருக்கும் பிற சலுகைகள் எதுவும் இல்லை.

இந்த விசித்திரமான பின்னொட்டு என்ன அர்த்தம்? =eip? இதற்கு அனுமதிகளின் தன்மையை ஓரளவு புரிந்து கொள்ள வேண்டும். ஒவ்வொரு செயல்முறைக்கும் மூன்று செட் அனுமதிகள் உள்ளன - பயனுள்ள, பரம்பரை மற்றும் அனுமதிக்கப்பட்ட:

  • பயனுள்ள அனுமதிகள் என்பது ஒரு செயல்முறை உண்மையில் என்ன செய்ய முடியும் என்பதை வரையறுக்கிறது. உதாரணமாக, அது மூல சாக்கெட்டுகளை சமாளிக்க முடியாது CAP_NET_RAW பயனுள்ள தொகுப்பில் இல்லை.
  • கிடைக்கும் அனுமதிகள் என்பது ஒரு செயல்முறை பொருத்தமான அழைப்பைப் பயன்படுத்தி அவற்றைக் கோரினால் அனுமதிக்கப்படும். குறிப்பிட்ட அனுமதியைக் கோருவதற்காக எழுதப்பட்டிருந்தால் தவிர, ஒரு செயல்முறையை உண்மையில் எதையும் செய்வதிலிருந்து அவை தடுக்கின்றன. இது உண்மையில் தேவைப்படும் காலத்திற்கு மட்டுமே பயனுள்ள தொகுப்பில் முக்கியமான அனுமதிகளைச் சேர்க்க செயல்முறைகளை எழுத அனுமதிக்கிறது.
  • பரம்பரை அனுமதிகள் என்பது ஸ்பான் செய்யப்பட்ட குழந்தை செயல்முறையின் அணுகக்கூடிய தொகுப்பில் பெறக்கூடியவை. அறுவை சிகிச்சையின் போது fork() அல்லது clone() குழந்தை செயல்முறைக்கு எப்போதும் பெற்றோர் செயல்முறையின் அனுமதிகளின் நகல் வழங்கப்படுகிறது, ஏனெனில் அது அந்த நேரத்தில் அதே இயங்கக்கூடியது. ஒரு பரம்பரை தொகுப்பு எப்போது பயன்படுத்தப்படுகிறது exec() (அல்லது அதற்கு சமமான) இயங்கக்கூடிய கோப்பினை மற்றொன்றுடன் மாற்றுவதற்கு அழைக்கப்படுகிறது. இந்த கட்டத்தில், புதிய செயல்முறைக்கு பயன்படுத்தப்படும் அணுகக்கூடிய தொகுப்பைப் பெற, செயல்முறையின் கிடைக்கக்கூடிய தொகுப்பு பரம்பரை தொகுப்பால் மறைக்கப்படுகிறது.

எனவே பயன்பாடு setcap கொடுக்கப்பட்ட இயங்கக்கூடியவற்றுக்கு இந்த மூன்று தொகுப்புகளின் அனுமதிகளை சுயாதீனமாக சேர்க்க அனுமதிக்கிறது. கோப்பு அனுமதிகளுக்கு குழுக்களின் பொருள் சற்று வித்தியாசமாக விளக்கப்படுகிறது என்பதை நினைவில் கொள்க:

  • கிடைக்கிறது கோப்பு அனுமதிகள் என்பது எப்பொழுதும் இயங்கக்கூடிய கோப்புக்குக் கிடைக்கும், அதை அழைக்கும் பெற்றோர் செயல்முறை அவற்றைக் கொண்டிருக்கவில்லை என்றாலும். அவை "கட்டாய" அனுமதிகள் என்று அழைக்கப்படுகின்றன.
  • பரம்பரை கோப்பு அனுமதிகள் கூடுதல் முகமூடியை வரையறுக்கின்றன, இது அழைப்பு செயல்முறையின் தொகுப்பிலிருந்து அனுமதிகளை அகற்றவும் பயன்படுகிறது. அழைப்பு செயல்முறையின் பரம்பரை தொகுப்புடன் கூடுதலாக அவை பொருந்தும், எனவே இரண்டு செட்களிலும் அனுமதி இருந்தால் மட்டுமே அது மரபுரிமையாக இருக்கும்.
  • பயனுள்ள கோப்பு அனுமதிகள் உண்மையில் ஒரு பிட் மட்டுமே, ஒரு தொகுப்பு அல்ல, மற்றும் அமைக்கப்பட்டால், கிடைக்கக்கூடிய முழு தொகுப்பும் புதிய செயல்முறையின் பயனுள்ள தொகுப்பில் நகலெடுக்கப்படும் என்று அர்த்தம். அவற்றைக் கோருவதற்கு குறிப்பாக எழுதப்படாத செயல்முறைகளுக்கு அனுமதிகளைச் சேர்க்க இது பயன்படுத்தப்படலாம். இது ஒரு பிட் என்பதால், நீங்கள் எந்த அனுமதியையும் அமைத்தால், அது அனைத்து அனுமதிகளுக்கும் அமைக்கப்பட வேண்டும். அனுமதிகளை ஆதரிக்காத பயன்பாடுகளால் பயன்படுத்த அனுமதிக்கப்படுவதால், நீங்கள் அதை ஒரு மரபு பிட் என்று நினைக்கலாம்.

வழியாக அனுமதிகளைக் குறிப்பிடும்போது setcap மூன்று எழுத்துக்கள் e, i и p தொடர்பு பயனுள்ள, பரம்பரை மற்றும் அணுகக்கூடிய முறையே அமைக்கிறது. எனவே, முந்தைய விவரக்குறிப்பு:

sudo setcap cap_net_raw=eip tracewalk

...தீர்மானம் என்பதைக் குறிக்கிறது CAP_NET_RAW கிடைக்கக்கூடிய மற்றும் பரம்பரை தொகுப்புகளுடன் சேர்க்கப்பட வேண்டும், மேலும் பயனுள்ள பிட்டும் அமைக்கப்பட வேண்டும். இது கோப்பில் முன்னர் அமைக்கப்பட்ட அனுமதிகளை மீறும். ஒரே நேரத்தில் பல அனுமதிகளை அமைக்க, கமாவால் பிரிக்கப்பட்ட பட்டியலைப் பயன்படுத்தவும்:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

அனுமதி வழிகாட்டி இவை அனைத்தையும் இன்னும் விரிவாக விவாதிக்கிறது, ஆனால் இந்த இடுகை கொஞ்சம் கொஞ்சமாக என்ன நடக்கிறது என்பதை நிராகரித்துள்ளது. குறிப்பிடுவதற்கு சில எச்சரிக்கைகள் மற்றும் தந்திரங்கள் மட்டுமே உள்ளன.

முதலில், கோப்பு திறன்கள் சிம்லிங்க்களுடன் வேலை செய்யாது - நீங்கள் அவற்றை பைனரி கோப்பிலேயே பயன்படுத்த வேண்டும் (அதாவது சிம்லிங்கின் இலக்கு).

இரண்டாவதாக, அவை விளக்கப்பட்ட ஸ்கிரிப்ட்களுடன் வேலை செய்யாது. எடுத்துக்காட்டாக, உங்களிடம் பைதான் ஸ்கிரிப்ட் இருந்தால், அதற்கான அனுமதியை நீங்கள் பைதான் மொழிபெயர்ப்பாளருக்கே ஒதுக்க வேண்டும். வெளிப்படையாக இது ஒரு சாத்தியமான பாதுகாப்புச் சிக்கலாகும், ஏனெனில் அந்த மொழிபெயர்ப்பாளருடன் செயல்படுத்தப்படும் அனைத்து ஸ்கிரிப்ட்களும் குறிப்பிட்ட அனுமதியைப் பெற்றிருக்கும், இருப்பினும் இது SUID ஆக்குவதை விட இன்னும் சிறப்பாக உள்ளது. மிகவும் பொதுவான தீர்வாக சி அல்லது அதற்கு சமமான தனி இயங்குதளத்தை எழுதுவது, தேவையான செயல்பாடுகளைச் செய்து அதை ஸ்கிரிப்ட்டிலிருந்து அழைக்கலாம். இது பைனரியைப் பயன்படுத்தும் வயர்ஷார்க் பயன்படுத்தும் அணுகுமுறையைப் போன்றது /usr/bin/dumpcap சலுகை பெற்ற செயல்பாடுகளைச் செய்ய:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

மூன்றாவதாக, சூழல் மாறியைப் பயன்படுத்தினால் கோப்பு அனுமதிகள் முடக்கப்படும் LD_LIBRARY_PATH வெளிப்படையான பாதுகாப்பு காரணங்களுக்காக(1). அதே பொருந்தும் LD_PRELOAD, எனக்கு தெரிந்தவரையில்.

1. தாக்குபவர் ஒரு நிலையான நூலகங்களில் ஒன்றை வெளிப்படையாக மாற்றி பயன்படுத்த முடியும் என்பதால் LD_LIBRARY_PATHஅதன் நூலகத்தை சிஸ்டம் ஒன்றுக்கு முன்னுரிமையாக அழைக்கும்படி கட்டாயப்படுத்தவும், எனவே அழைப்புப் பயன்பாட்டிற்கான அதே சலுகைகளுடன் அதன் சொந்த தன்னிச்சையான குறியீட்டை செயல்படுத்தவும்.

அவ்வளவுதான். பாடத்திட்டத்தைப் பற்றிய கூடுதல் விவரங்களை இங்கே காணலாம் webinar, இது ஜனவரி 24 அன்று நடைபெறும்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்