مهندس کلان داده | عضو هیئت مدیره شرکت داده پایای سپهر | عضو هیئت مدیره شرکت مدیریت دارایی راسا
بررسی عملی امنیت زیرساخت های کلان داده - بخش دوم
به روزرسانی: بخش سوم این مستند منتشر شد. پس از مطالعه این بخش، به سراغ قسمت بعدی در این لینک بروید.
در بخش قبل به کلیات و اصول امنیت زیرساخت های کلان داده و بررسی راهکارهای اولیه پرداخته شد. در این بخش نگاه عمیق تری به راه حل های موجود خواهیم داشت و در عمل آنها را بررسی خواهیم کرد.
توجه: اگر بخش قبل را مطالعه نکردید، به این لینک مراجعه کنید.
نصب و راه اندازی Kerberos
به منظور نصب و راه اندازی مکانیزم امنیتی Kerberos می بایست ماشین سرور یا همان KDC و سرویس گیرندگان به کتابخانه و نرم افزار آن مجهز شوند. سیستم عامل انتخابی ما برای نصب CentOS نسخه 7 و Kerberos نسخه 5 می باشد.
در ابتدا می بایست همه ماشین های یک قلمرو یا Realm دارای یک نام میزبان مشابه باشند تا بتوانند در Realm اضافه شوند. نام میزبان در هنگام نصب سیستم عامل از کاربر دریافت می شود. اگر اینکار را انجام نداده اید می توانید با اجرای دستور زیر در ترمینال سیستم عامل، نام میزبان ماشین ها را تغییر دهید:
sudo hostnamectl set-hostname test.comهمچنین در فایل /etc/hosts سیستم عامل می بایست تمامی ماشین ها حاوی نام میزبان خود باشند. با استفاده از ویرایشگرهای متنی این فایل را برای ویرایش باز کنید و به صورت زیر تغییر دهید:
192.168.1.1 masternode test.com
192.168.1.2 slavenode1 test.com
192.168.1.3 slavenode2 test.com
اینکار باعث می شود اگر کاربر بخواهد برروی هرکدام از ماشین های کلاستر، عملیات کاربری مربوط به زیرساخت کلان داده را انجام دهد با مشکل مواجه نشود(علت مشکلی که کاربر با آن مواجه می شود را در ادامه توضیح خواهیم داد).
حال نوبت به نصب اجزای اصلی می رسد. برروی ماشینی که نقش سرور Kerberos را بر عهده دارد(در اینجا همان ماشین masternode) دستورات زیر را جهت نصب نرم افزار سرور و کتابخانه های کاربری Kerberos برروی ترمینال سیستم عامل اجرا می کنیم:
sudo yum install krb5-serversudo yum install krb5-workstationبرروی ماشین های سرویس گیرنده و یا فرعی فقط کافی است با استفاده از دستور زیر نرم افزار مربوط به کتابخانه های کاربری نصب شود:
sudo yum install krb5-workstationبعد از نصب نرم افزارها، نوبت به اعمال تنظیمات می رسد. در مسیر /var/Kerberos/krb5kdc فایل kdc.conf را با یکی از ویرایشگرهای متنی برای ویرایش باز کنید و در بخش realms نام قلمرو(در اینجا به طور مثال TEST.COM) را منحصرا با حروف بزرگ وارد کنید. به صورت زیر:
[realms]
TEST.COM = {
….
}
با انجام اینکار تنظیمات خاص مربوط به قلمرو موردنظر ما در KDC تعریف می شود. نوشتن نام قلمرو با حروف بزرگ قراردادی است که توسط توسعه دهندگان آن تعیین شده است و می بایست رعایت شود.
سپس فایل تنظیمات مربوطه را ذخیره می کنیم. نمای کلی این فایل پس از ویرایش به صورت زیر خواهد بود:
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
TEST.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
پس از انجام اینکار، فایل تنظیمات کاربری Kerberos به نام krb5.conf در مسیر /etc را با یکی از ویرایشگرهای متنی برای ویرایش باز کنید و تغییرات زیر را اعمال کنید:
الف) در بخش libdefaults مقدار default_ccache_name را با قراردادن علامت شارپ(#) در ابتدای آن کامنت کنید(علت اینکار عدم شناسایی مسیر موقت ذخیره سازی TGT در برخی از نسخه های نرم افزارهای کلان داده می باشد. با انجام اینکار به Kerberos میگوییم اطلاعات مربوط به بلیط های کاربری را در مسیر موقت سیستم عامل یعنی /tmp ذخیره کن).
ب) در بخش قبلی مقدار default_realm را برابر با نام قلمرو تعیین شده(در اینجا TEST.COM) با حروف بزرگ قرار دهید(علت اینکار این است که همواره برای سهولت در ایجاد Principal ها و به طور کل انجام عملیات مربوط به Kerberos نیازی که ذکر نام قلمرو نیست و این مقدار مورد استفاده قرار میگیرد).
ج) در بخش realms نام قلمرو به همراه آدرس های میزبان مربوط به KDC و Admin Server را تغییر دهید. به صورت زیر:
TEST.COM = {
kdc = masternode:88
admin_server = masternode
}
در تنظیمات بالا نقش KDC را ماشین سرور(در اینجا masternode) بازی می کند و قراردادن شماره پورت پیش فرض این سرویس که 88 است در انتهای نام میزبان ضروری می باشد. همچنین در این بخش می بایست نام میزبان ماشین مربوط به Admin Server را وارد کنید. در مثال ما سرویس های KDC و Admin Server بر روی یک ماشین قرار دارند(سرویس Admin Server همان Kadmin می باشد که نقش پایگاه داده Kerberos را بازی می کند. در ادامه نقش این پایگاه داده را توضیح خواهیم داد).
د) در بخش domain_realm مقادیر مربوط به فضای نام قلمرو را به صورت زیر تغییر می دهیم:
.test.com = TEST.COM
test.com = TEST.COM
اینکار باعث می شود تا اگر کاربری نام قلمرو و همچنین زیردامنه های قلمرو را به صورت حروف کوچک مورد استفاده قرار داد، مشکلی در روند کار بوجود نیاید و به حروف بزرگ برگردان شود.
در نهایت فایل تنظیمات را ذخیره می کنیم و این تغییرات را برروی تمامی ماشین های کلاستر تکرار می کنیم. نمای کلی این فایل پس از ویرایش به صورت زیر است:
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_tkt_enctypes = aes256-cts-hmac-sha1-96 arcfour-hmac des-cbc-md5 des-cbc-crc
default_tgs_enctypes = aes256-cts-hmac-sha1-96 arcfour-hmac des-cbc-md5 des-cbc-crc
permitted_enctypes = aes256-cts-hmac-sha1-96 arcfour-hmac des-cbc-md5 des-cbc-crc
default_realm = TEST.COM
# default_ccache_name = KEYRING:persistent:%{uid}
[realms]
MOBINRANJBAR.COM = {
kdc = masternode:88
admin_server = masternode
}
[domain_realm]
.test.com = TEST.COM
test.com = TEST.COM
در مرحله بعد، می بایست قلمرو تعریف شده در تنظیمات را در پایگاه داده ایجاد کنیم و دستور زیر را برای اینکار اجرا کنیم:
kdb5_util create -r TEST.COM -sدر اجرای دستور بالا ممکن است با خطای دسترسی مواجه شوید که می توان با قرار دادن sudo در ابتدای دستور این مشکل را برطرف کرد. با اجرای دستور بالا برای اولین بار، کلمه عبور اصلی مربوط به پایگاه داده از کاربر درخواست می شود که می بایست یک کلمه عبور دلخواه وارد شود. این کلمه عبور برای کار با Kadmin و همچنین دسترسی KDC به پایگاه داده ضروری است.
پارامترهای r و s به ترتیب برای تعیین نام قلمرو و ذخیره سازی کلمه عبور اصلی پایگاه داده در فایل stash می باشد(فایل stash یک فایل محلی حاوی کلمه عبور کد شده می باشد. این فایل هنگام اجرای سرویس های krb5kdc و kadmind جهت اعلام کلمه عبور پایگاه داده به کار می رود).
پس از انجام اینکار، حال می بایست به سرویس kadmin اعلام کنیم که قلمرویی که می بایست برروی آن فعالیت کند چیست. برای اینکار فایل kadm5.acl را با یکی از ویرایشگرهای متنی برای ویرایش باز کنید و مقدار زیر را وارد کنید:
*/admin@TEST.COM *
سپس فایل موردنظر را ذخیره کنید.
پس از انجام تنظیمات اولیه، می بایست سرویس های kadmin مربوط به Admin Server و krb5kdc مربوط به KDC را راه اندازی کنیم. با دستورات زیر این سرویس ها را راه اندازی می کنیم:
sudo service krb5kdc startsudo service kadmin startبا اجرای دستورات بالا سرویس های اصلی Kerberos راه اندازی می شود. نکته ای که می بایست دقت کنید این است که این سرویس ها هنگام راه اندازی مجدد سرور و یا خاموش شدن ناگهانی آن مجددا راه اندازی نمی شود. برای اجرای این سرویس ها هنگام راه اندازی سیستم عامل کافی است دستورات زیر را اجرا نمایید:
sudo chkconfig krb5kdc onsudo chkconfig kadmin onشروع کار با Kerberos
پس از نصب موفقیت آمیز Kerberos در این بخش به چگونگی انجام عملیات کاربری متداول می پردازیم. اولین کاری که پس از نصب عموما انجام می گیرد، تعریف Principal هم در محیط مدیریتی Kerberos یا همان kadmin است. برای اینکار برروی سروری که عنوان Admin Server است دستور زیر را وارد کنید تا به این محیط وارد شوید.
sudo kadmin.localدستورات کاربری پرکاربرد این محیط در جدول 1 قرار داده شده است.

بسته کاربری Kerberos نیز شامل دستورات پرکاربردی می شود که در زیر آنها را معرفی می کنیم:
1. دستور Kinit : وظیفه این دستور نگهداری و کش کردن بلیط برای یک Principal خاص می باشد. با اجرای این دستور در محیط ترمینال به این معنی است، کاربری که هویت خود را احراز کرده است اجازه اجرای عملیات سرویس موردنظر برروی این ترمینال را دارا می باشد. در واقع این دستور هم وظیفه احراز هویت و هم اعطای مجوز را بر عهده دارد. از نگاه دیگر، این دستور را می توان مترادف عملیات login دانست.
2. دستور Klist : این دستور بلیط های مربوط به یک Principal خاص موجود برروی حافظه موقت و یا کلیدهای موجود برروی یک فایل keytab را لیست می کند. به طور کل با اجرای این دستور می توان بررسی کرد آیا کاربر احراز هویت شده و دارای مجوز یا بلیط می باشد یا خیر.
3. دستور kdestroy : با اجرای این دستور تمامی بلیط های موجود برروی حافظه موقت حذف می شوند. این دستور مترادف عملیات logout در سیستم های متداول می باشد.
برای درک دقیق تر عملیات شرح داده شده در بالا، اجازه دهید یک مثال کامل را پیاده سازی کنیم.
فرض کنید میخواهیم کاربری به نام hduser را احراز هویت کنیم و به او اجازه دهیم سرویس موردنظر خود را اجرا کند. مرحله احراز هویت به دو صورت می تواند انجام گیرد. کاربر با استفاده از رمزعبور خود به سیستم عامل وارد می شود اما کاربر یا سرویس تعریف شده برروی Kerberos هم دارای یک رمزعبور است. این رمز با رمزعبور کاربر برروی سیستم عامل چه تفاوتی دارد؟ فرض کنید کاربر موردنظر، یک کاربر اشتراکی است. به این معنی که این کاربر احراز هویت سیستمی شده است اما مشخص نیست برای کدام سرویس ها احراز هویت شده است. کاری که دستور kinit انجام می دهد این است که در هنگام ورود و یا احراز هویت عملیات اعطای مجوز نیز انجام می گیرد. حال فرض کنید کاربر موردنظر اجازه استفاده از سرویس های خاص را نداشته باشد. طبیعتا رمزعبور احراز هویت در آن سرویس را نخواهد داشت.
همچنین، عملیات احراز هویت و اعطای مجوز را می توان با استفاده از یک فایل کلید با پسوند .keytab نیز انجام داد. به اینصورت که دیگر نیازی به اعلام رمزعبور نمی باشد و فایل کلید موردنظر حاوی رمز کدشده کاربر می باشد. مزیت اینکار در این است که برای اجرای سرویس ها و نرم افزارهای مختلف می توان کاربر را به صورت خودکار احراز هویت نمود.
برای انجام این مثال فرض می کنیم که کاربر hduser برروی سیستم عامل تعریف شده است و دارای رمزعبور مخصوص به خود می باشد. این کاربر یک SPN برروی Kerberos می باشد. به این معنی که نقشی در سرویس خاصی ندارد و یک کاربر معمولی است.
مرحله اول تعریف کاربر موردنظر در kadmin می باشد. با دستور زیر با محیط موردنظر وارد می شویم:
sudo kadmin.localسپس با استفاده از دستور زیر Principal مخصوص به این کاربر را اضافه می کنیم. دستور زیر را در اعلان محیط kadmin وارد می کنیم:
addprinc hduser@TEST.COMبا اجرای دستور بالا، رمزعبور دلخواه برای این کاربر درخواست می شود که در هنگام احراز هویت می توان از این رمز استفاده کرد. شکل دیگر دستور بالا به صورت است که در هنگام ساخت فایل کلید keytab مورد استفاده قرار میگیرد و دیگر نیازی به وارد کردن رمزعبور دلخواه نیست:
addprinc -randkey hduser@TEST.COMپارامتر -randkey به kadmin اعلام می کند که رمزعبور را به صورت تصادفی و کدشده تولید کند.
در شکل اول اجرای این دستور، نیازی به انجام عملیات دیگری نمی باشد و با اجرای دستور زیر از محیط kadmin خارج شوید:
exitامام در شکل دوم اجرای دستور بالا، به دلیل اینکه کاربر موردنظر از رمز عبور خود اطلاع ندارد و یا یک کاربر سرویس است می بایست فایل کلید رمز را تولید کنیم. با دستور زیر می توان فایل کلید مربوط به کاربر خاص را در محیط kadmin تولید کرد:
xst -kt /home/myuser/hduser.keytab hduser@TEST.COMبا اجرای دستور بالا در مسیر /home/myuser/ فایل کلید به نام hduser.keytab ساخته می شود که این فایل بیانگر رمزعبور کاربر موردنظر می باشد که قاعدتا می بایست از این فایل محافظت شود. نکته مهم در استفاده از این فایل این است که مالک یا owner فایل کلید می بایست همان کاربری باشد که از آن استفاده می کند و پیشنهاد می شود دسترسی کد 400 را به صورت زیر به فایل کلید نسبت دهید:
chmod 400 /home/myuser/hduser.keytabپس از انجام اینکار، کاربر موردنظر در محیط کاربری خود کافی است دستور زیر را اجرا کند و رمزعبور خود را وارد کند:
kinit hduser@TEST.COMاگر دستور بالا با موفقیت اجرا شود هیچ پیامی در خروجی چاپ نمی شود و نتیجه را می توان با اجرای دستور klist مشاهده کرد. خروجی نمونه این دستور به صورت زیر می باشد:
Ticket cache: FILE:/tmp/krb5cc_1001
Default principal: hduser@TEST.COM
Valid starting Expires Service principal
2020-03-26T13:24:47 2020-03-27T13:24:47 krbtgt/TEST.COM@TEST.COM
با اجرای دستورات بالا، کاربر موردنظر با موفقیت احراز هویت شده است و می تواند از سرویس موردنظر استفاده کند. شاید این سوال برای شما ایجاد شده باشد که این بلیط تا چه زمانی معتبر می باشد؟
اتفاقاتی که برای بلیط می تواند رخ دهد به صورت زیر است:
1. حذف بلیط از طریق اجرای kdestroy : با استفاده از دستور kdestroy می توان تمامی بلیط های معتبر را از حافظه موقت حذف کرد.
2. سررسید تاریخ اعتبار بلیط: هر Principal در Kerberos دارای تاریخ انقضا می باشد که در هنگام ساخت می توان آنرا مشخص نمود. اگر این تاریخ به سر رسد، بلیط از درجه اعتبار ساقط می شود. با اجرای دستور زیر می توان در هنگام ساخت Principal تاریخ انقضا را تعیین کرد:
addprinc hduser -expire "1/1/2020 12:01am EST"3. سررسید عمر بلیط: مشابه تاریخ اعتبار بلیط، هر Principal در Kerberos دارای یک عمر تعیین شده هستند که این زمان می تواند محدود و یا نامحدود باشد. به صورت پیش فرض این مقدار برروی 1 روز تنظیم شده است. این مقدار را می توان از طریق مقدار ticket_lifetime در فایل تنظیمات kdc.conf در مسیر /var/Kerberos/krb5kdc تنظیم کرد. البته برای هر بلیط هم می توان این مقدار را قائل بود و اگر این مقدار در هنگام ساخت Principal تعیین نگردد، مقدار پیش فرض انتخاب می شود. در هنگام ساختPrincipal می توان به صورت زیر عمر بلیط را تعیین کرد:
addprinc hduser -maxlife "5 days"برای انجام عملیات kinit از طریق فایل کلید می توان به صورت زیر اقدام کرد:
kinit -kt /home/myuser/hduser.keytab hduser@TEST.COMپیکربندی هدوپ و فعال سازی Kerberos در آن
به منظور پیکربندی هدوپ و Kerberos می بایست مرحله ابتدایی فاز نصب و راه اندازی Kerberos که همان تنظیم فایل /etc/hosts است انجام گیرد تا ماشین های اصلی و فرعی مشخص شوند. پس از انجام اینکار. می بایست کاربران و گروه کاربری سرویس ها برروی تمامی ماشین ها ساخته شوند. نقشه کاربران موردنیاز هدوپ را می توانید در جدول 2 مشاهده کنید.

با استفاده از دستورات زیر می توان کاربران و گروه کاربری موردنظر را در ماشین های در اختیار هدوپ ایجاد کرد:
sudo groupadd hadoop
sudo useradd -g hadoop hdfs
sudo passwd hdfs
sudo useradd -g hadoop mapred
sudo passwd mapred
sudo useradd -g hadoop yarn
sudo passwd yarn
sudo useradd -g hadoop http
sudo passwd httpدر خط شماره 1، گروه کاربری Hadoop ساخته شد و کاربران موردنیاز در جدول 2 به ترتیب در خطوط بعدی ساخته شدند و رمزعبور هرکدام تنظیم شد..
نکته قابل توجه در این بخش این است که کاربران اصلی مثل hdfs و yarn می بایست دارای دسترسی مدیر باشند. به این معنی که قابلیت اجرای sudo را داشته باشند. علت آن را در ادامه توضیح خواهیم داد.
در مرحله بعد، با استفاده از دستور زیر می بایست به محیط ترمینال کاربر hdfs وارد شوید. برای اینکار می توانید از دستور زیر استفاده کنید:
su hdfsدر هنگام راه اندازی سرویس های هدوپ، رمزعبور مربوط به کاربر به صورت مکرر از کاربر دریافت می شود و ممکن است در روند اجرای سرویس باعث اختلال شود. با استفاده از دستورات زیر و اجرای آنها در همه ماشین ها می توانیم کاربر راه دور را به سیستمی که قصد اجرای سرویس های هدوپ را دارد معرفی کنیم:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@masternode
ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@slavenode1
ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@slavenode2
chmod 0600 ~/.ssh/authorized_keysبه تعداد ماشین های موجود در کلاستر خط شماره 3 و 4 تکرار می شود.
در مرحله بعد می بایست بسته هدوپ را دانلود و استخراج کنید. در این سند از نسخه هدوپ 2.10.0 استفاده خواهیم کرد. نکته قابل توجه در این مرحله این است که زمانیکه هدوپ به صورت چندکاربره و امنیت کامل راه اندازی می شود می بایست در یک مسیر مشخص در سیستم عامل قرار گیرد. پس بسته فشرده هدوپ را در مسیر عمومی مانند /usr/share قرار می دهیم و مالک پوشه هدوپ و تمامی زیرفایل ها و پوشه های آن را از طریق دستور زیر به کاربر hdfs تغییر می دهیم:
sudo chown -R hdfs:hadoop /usr/share/hadoopهمچنین می بایست مسیر مربوط به ذخیره سازی ابرداده ها و داده ها را بسازید. در مسیر /usr/share یک پوشه دلخواه به طور مثال به نام hadoopstorage بسازید و در این پوشه، در ماشین اصلی یا NameNode پوشه name و در ماشین فرعی یا DataNode پوشه data را ایجاد کنید. پس از انجام اینکار با اجرای دستور بالا و تغییر مسیر پوشه به hadoopstorage مالک این پوشه را نیز به hdfs تغییر دهید.
پس از انجام اینکار نیاز به پیکربندی JCE و JSVC می باشد که در روند پیکربندی هدوپ بسیار حائز اهمیت می باشد. JCE در واقع یک بسته کتابخانه حاوی دو فایل اجرایی در جاوا می باشد که شامل استانداردهای قابل قبول جهت رمزنگاری و رمزگشایی در شبکه توسط سازندگان جاوا می شود. به دلیل استفاده Kerberos از الگوریتم ها و استاندارد های رمزنگاری و رمزگشایی مانند AES256 در صورت عدم وجود این کتابخانه، نرم افزارهایی که مبتنی بر جاوا هستند نظیر هدوپ را با مشکل مواجه می کند. نرم افزار JSVC نیز یک فایل اجرایی می باشد که جهت انجام ارتباط امن بین ماشین های فرعی یا DataNode ها مورد استفاده قرار می گیرد که در صورت عدم وجود این فایل اجرایی، نصب و راه اندازی هدوپ با خطا مواجه می شود.
به منظور پیکربندی JCE ابتدا می بایست بسته موردنظر را از سایت اوراکل جاوا دانلود کنید. پس از دانلود دو فایل موجود در این بسته با نام های local_policy.jar و US_export_policy.jar را در مسیر $JAVA_HOME/jre/lib/security کپی کنید. اگر این فایل ها موجود هستند آنها را با جدیدترین نسخه جایگزین نمایید. پس از آن فایل java.security در همان مسیر را با یکی از ویرایشگرهای متنی برای ویرایش باز کنید. در این فایل مقدار crypto.policy را پیدا کنید و به صورت زیر از حالت کامنت خارج کنید:
crypto.policy=unlimited
پس از انجام اینکار فایل با ذخیره کنید.
در مرحله بعد بسته سورس کد commons-daemon که حاوی کدهای فایل اجرایی jsvc است را از این لینک دانلود و سپس با دستورات زیر آنرا کامپایل می کنیم. این بسته به صورت دودویی و اجرایی نیز وجود دارد اما به دلیل اینکه حاوی فایل اجرایی jsvc نمی باشد و این فایل فقط در فرآیند کامپایل سورس کد اصلی ساخته می شود از استفاده از این بسته خودداری می کنیم. بسته موردنظر را استخراج کرده و وارد پوشه src/native/unix می شویم. به صورت زیر دستورات را اجرا می کنیم:
./configure
makeپس از اجرای موفقیت آمیز دستورات بالا، فایل اجرایی jsvc به همین نام در مسیر جاری ایجاد می شود. این فایل را در مسیر $HADOOP_HOME/sbin کپی کنید.
به منظور اعطای مجوز و احراز هویت کاربر سرویس هدوپ، می بایست کاربران موردنظر را در kadmin تعریف و فایل کلیدهای آنان را پس از تولید در مسیر تنظیمات هدوپ قرار دهید. برای ساخت Principal ها و تولید فایل های کلید مخصوص به آنها دستورات زیر را در kadmin وارد می کنیم:
addprinc -randkey hdfs/masternode
addprinc -randkey mapred/masternode
addprinc -randkey yarn/masternode
addprinc -randkey HTTP/masternode
xst -kt /home/hdfs/hdfs.keytab hdfs/masternode
xst -kt /home/hdfs/mapred.keytab mapred/masternode
xst -kt /home/hdfs/yarn.keytab yarn/masternode
xst -kt /home/hdfs/http.keytab HTTP/masternodeپس از انجام دستورات بالا، فایل های کلید ساخته شده را در مسیر ذکر شده در بالا منتقل و طبق مثال مطرح شده در بخش نصب و راه اندازی Kerberos دسترسی های موردنظر را تنظیم نمایید. لازم به ذکر است فایل کلیدهای ساخته شده می بایست در همه ماشین ها کپی شوند و وجود آنها در تمامی ماشین ها الزامی است.
به سراغ اعمال تنظیمات هدوپ می رویم. برای شروع از ماشین اصلی یا NameNode شروع می کنیم. تنظیمات مربوط به هدوپ در پوشه /etc/Hadoop قرار گرفته اند. ابتدا نیاز است تا نام ماشین های فرعی در فایلی به نام slaves قرار گیرد. فایل slaves در این پوشه را با یکی از ویرایشگرهای متنی باز کنید و به صورت خط به خط نام ماشین های فرعی را به صورت زیر در آن وارد کنید و سپس فایل را ذخیره کنید:
slavenode1
slavenode2
فایل بعدی جهت اعمال تنظیمات، فایلی به نام hadoop-env.sh است که تنظیمات مربوط به متغیرهای محیطی در آن قرار میگیرد. مقدادیری که می بایست تغییر کنند به قرار زیر هستند:
1. مقدار JAVA_HOME را از حالت کامنت خارج کرده و مسیر نصب شده jdk را به صورت زیر وارد نمایید:
export JAVA_HOME=/usr/lib/jvm/jdk1.8
2. مقدار JSVC_HOME را از حالت کامنت خارج کرده و مسیر مربوط به فایل اجرایی JSVC که همان sbin هست را به صورت زیر وارد نمایید:
export JSVC_HOME=/usr/share/hadoop/sbin
3. مقدار HADOOP_SECURE_DN_USER را از حالت کامنت خارج کرده و نام کاربر سرویسی(در اینجا hdfs) که برروی ماشین های فرعی وظیفه اجرای سرویس را دارد را وارد کنید:
export HADOOP_SECURE_DN_USER=hdfs
فایل موردنظر را ذخیره کنید.
در مرحله بعد به سراغ فایل core-site.xml می رویم. این فایل را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
مقدار مربوط به خط 3 جهت تعریف آدرس و شماره پورت NameNode می باشد. خطوط شماره 7 و 11 نیز جهت فعال سازی امنیت در هدوپ می باشد.
پس از انجام این مرحله، فایل hdfs-site.xml را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
مقدار تعریف شده در خط شماره 3 مربوط به تعیین مسیر ذخیره سازی ابرداده ها در ماشین اصلی می باشد. در خط شماره 7 مقدار فاکتور کپی سازی بلوک ها تعریف شده است. همچنین خط شماره 11 به منظور فعال سازی قابلیت Access Token برای تبادل توکن های دسترسی بین ماشین های فرعی می باشد. در خطوط شماره 15 تا 46 به تعریف Principal ها و آدرس فایل کلیدهای مربوط به سرویس های هدوپ پرداختیم. در خطوط 47، 51 و 55 به ترتیب امکان بررسی نام آدرس و IP در NameNode، فعال سازی قابلیت استفاده DataNode ها از نام میزبان و فعال سازی مکانیزم ACL را اعمال می کنیم.
در مرحله بعد فایل mapred-site.xml.templace را از طریق دستور زیر به mapred-site.xml تغییر نام دهید:
mv mapred-site.xml.templace mapred-site.xmlسپس آنرا با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
در خط شماره 3 به هدوپ اعلام می کنیم که فرقی بین نسخه 1 و 2 هدوپ قائل نیستیم و همواره چارچوب مربوط به اجرای برنامه های ساختار MapReduce را برابر با YARN قرار می دهیم.
در مرحله بعد فایل yarn-site.xml را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
در خط شماره 3 به YARN اعلام می کنیم که نام میزبان مربوط به سرویس ResourceManager چیست. در خط شماره 7 اعلام می کنیم که روش کار عملیات مربوط به Recovery در NodeManager برای اجرای مجدد این سرویس چیست. مقادیر تعریف شده در خطوط شماره 10 تا 17 نیز مربوط به تعریف Principal ها و آدرس قرارگیری فایل کلیدهای سرویس های YARN می شود.
در مرحله بعد به سراغ ماشین های فرعی یا DataNode می رویم. فایل های slaves، Hadoop-env.sh، core-site.xml و mapred-site.xml مشابه فایل های موجود برروی ماشین NameNode می باشد و کافی است آنها را کپی کنید.
در ماشین DataNode به سراغ فایل hdfs-site.xml بروید و این فایل را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
مقادیر فایل بالا تقریبا مشابه فایل موردنظر در ماشین NameNode است با این تفاوت که در خط شماره 3 مسیر مربوط به ذخیره سازی داده ها قرار می گیرد. همچنین خطوط شماره 10 تا 33 مقادیر مربوط به تعیین Principal ها و مسیر قرارگیری فایل کلیدهای مربوط به NameNode و DataNode می باشند. در خطوط شماره 35 و 39 دو مقدار جدید تعریف شده است که برای تعریف شماره پورت های DataNode می باشند. علت تغییر مقادیر پیش فرض این دو مقدار این است که برای استفاده از شماره پورت های بالای 1024 در سیستم عامل دسترسی های خاصی نیاز است که DataNode در هنگام تصاحب این شماره پورت ها دارای مشکل می شود و به صورت پیش فرض نیز برروی این شماره پورت ها تنظیم شده است. به همین منظور این شماره پورت ها را به دلخواه زیر 1024 مقداردهی می کنیم.
فایل بعدی جهت تنظیم در ماشین DataNode فایل yarn-site.xml می باشد. این فایل را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
مقادیر مربوط به فایل بالا، مشابه فایل موجود برروی ماشین NameNode می باشد ولی با این تفاوت که مقادیر مربوط به تعیین Principal ها و مسیر قرارگیری فایل کلیدهای مخصوص به ماشین NodeManager نیز به آن اضافه می شود.
عملیات موردنظر را در تمامی ماشین های DataNode دیگر تکرار می کنیم.
پس از انجام تنظیمات مربوطه، برای اولین بار می بایست NameNode را فرمت کنیم. برای انجام اینکار به مسیر bin از پوشه هدوپ بروید و دستور زیر را اجرا کنید:
./hadoop namenode -format
با اجرای موفقیت آمیز دستور بالا، پیغام زیر نمایش می یابد:
Storage directory XXXX has been successfully formatted.
مرحله بعد می بایست سرویس های اصلی HDFS را راه اندازی کنیم.
دقت کنید که ابتدا سرویس HDFS را اجرا می کنیم و اجرای سرویس YARN نیازمند تنظیمات بیشتری می باشد که در ادامه توضیح خواهیم داد.
پیش از اجرای سرویس، کاربر سرویس یعنی hdfs جهت راه اندازی می بایست احراز هویت شود. برای اینکار کافی است دستور زیر را وارد نمایید:
kinit -kt /usr/share/hadoop/etc/hadoop/hdfs.keytab hdfs/masternodeبرای اجرای سرویس HDFS پوشه جاری را به مسیر $HADOOP_HOME/sbin تغییر داده و دو دستور زیر را اجرا نمایید:
./start-dfs.shsudo ./start-secure-dns.shدر خط شماره 1 سرویس های NameNode و SecondaryNameNode راه اندازی می شوند ولی سرویس های DataNode برروی ماشین های خود راه اندازی نمی شوند. در خط شماره 2 سرویس های DataNode را با استفاده از فایل اسکریپت start-secure-dns.sh و دسترسی sudo اجرا می کنیم. علت آن این است که برخی از شماره پورت هایی که DataNode به آن نیاز دارد نیاز به دسترسی مدیر دارند و به همین علت با دستور sudo آنرا اجرا می کنیم.
پس از انجام دستورات بالا، با اجرای دستور jps از راه اندازی موفقیت آمیز سرویس های موردنظر اطمینان حاصل کنید. دقت کنید که خروجی این دستور برای هر کاربر متفاوت است و فقط می تواند سرویس های جاوایی که توسط کاربر جاری اجرا شده است را نمایش دهد. نکته دیگری که خوب است بدانید، زمانی که هدوپ را به صورت امن راه اندازی می کنید نام Process یا پردازه مربوط به DataNode به Secur تغییر پیدا می کند.
در مرحله بعد، به تنظیم سرویس YARN می پردازیم. تنظیمات مربوط به پیکربندی YARN تا حد زیادی در مراحل قبل انجام شده است و در ادامه به نکات پیکربندی کامل این سرویس می پردازیم.
در ابتدا همانند سرویس HDFS می بایست به محیط ترمینال کاربر yarn وارد شوید. برای اینکار می توانید از دستور زیر استفاده کنید:
su yarnفرض می کنیم که کاربر yarn دارای دسترسی sudo می باشد. به دلیل اینکه مالک پوشه هدوپ کاربر hdfs است، برخی فایل ها و پوشه می بایست مالک آن به کاربر yarn تغییر کند. اولین فایلی که می بایست مالک آن تغییر کند، فایل کلید مربوط به کاربر سرویس yarn است. با استفاده از دستور زیر مالک آنرا به yarn تغییر دهید:
sudo chown yarn:hadoop /usr/share/hadoop/etc/hadoop/yarn.keytabبه دلیل آنکه پوشه مربوط به ذخیره سازی گزارشات هدوپ یعنی logs در اختیار کاربر hdfs است و سرویس YARN نمی تواند گزارشات خود را در این پوشه ذخیره کند با خطا مواجه خواهد شد. برای این منظور یک پوشه به نام yarn و درون آن پوشه ای به نام logs می سازیم و مالک آنرا به کاربر yarn تغییر می دهیم. در مرحله بعد می بایست مسیر این پوشه را به سرویس YARN معرفی کنیم. خط زیر را در فایل .bashrc مربوط به کاربر yarn که در مسیر /home/yarn/.bashrc قرار دارد وارد می کنیم و فایل را ذخیره می کنیم:
export YARN_LOG_DIR=”/usr/share/hadoop/logs/yarn/logs”سرویس YARN برای ایجاد Container برروی ماشین های فرعی یا NodeManager از فایل اجرایی container-executor در مسیر bin و فایل تنظیمات مربوط به آن به نام container-executor.cfg در مسیر etc/Hadoop استفاده می کند. هدوپ جهت ایجاد Container برای اجرای برنامه های کاربران از کاربر root برای اینکار استفاده می کند. به همین علت دسترسی این 2 فایل می بایست بین کاربر root و کاربران گروه Hadoop مشترک باشد. به منظور سهولت در تعیین دسترسی موردنیاز، این 2 فایل را در پوشه ای جداگانه به نام دلخواه hadoop-yarn در مسیر /usr/share قرار می دهیم و دستورات زیر را جهت ایجاد پوشه های موردنیاز اجرا می کنیم:
sudo mkdir /usr/share/hadoop-yarn
sudo mkdir /usr/share/hadoop-yarn/bin
sudo mkdir /usr/share/hadoop-yarn/etc
sudo mkdir /usr/share/hadoop-yarn/etc/hadoopپوشه های موردنیاز را با استفاده از دستورات بالا با دسترسی root در مسیر موردنظر ایجاد کردیم. سپس 2 فایل ذکر شده در بالا را در مسیرهای ساخته شده کپی می کنیم. به صورت زیر:
sudo cp /usr/share/hadoop/bin/container-executor /usr/share/hadoop-yarn/bin
sudo cp /usr/share/Hadoop/etc/hadoop/container-executor.cfg /usr/share/hadoop-yarn/etc/hadoopپس از کپی فایل ها، فایل مربوط به تنظیمات یعنی container-executor.cfg را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر موجود را به صورت زیر تغییر دهید:
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=
min.user.id=500
allowed.system.users=
feature.tc.enabled=0
خط شماره 1 در بالا گروه کاربری مربوط به اجرای Container را تعیین می کند. در خطوط شماره 2 و 4 می توان تعیین کرد که چه کاربرانی اجازه اجرای Container را دارند و چه کاربرانی ندارند. خط شماره 3 کد شروع شناسه کاربران غیرسیستمی را تعیین می کند. در توزیع Centos این مقدار برابر با 500 و در توزیع های دیگر برابر با 1000 می باشد. در خط شماره 5 هم فعال یا غیرفعال بودن قابلیت TrafficControl تنظیم می شود. این قابلیت در NodeManager باعث می شود که این سرویس بتواند ترافیک مربوط در شبکه در ماشین های NodeManager را کنترل کند. فعال سازی آن در این بخش لازم نمی باشد.
در مرحله بعد، دسترسی های مربوط به این 2 فایل را با استفاده از دستورات بالا اعمال می کنیم:
sudo chown root:hadoop /usr/share/hadoop-yarn/bin/container-exeuctor
sudo chmod 6050 /usr/share/hadoop-yarn/bin/container-exeuctor
sudo chown root:hadoop /usr/share/hadoop-yarn/etc/hadoop/container-executor.cfg
sudo chmod 440 /usr/share/hadoop-yarn/etc/hadoop/container-executor.cfgسرویس YARN جهت راه اندازی امن نیاز به کتابخانه های Protoc دارد که در بسته هدوپ موجود می باشد. برای معرفی مسیر این فایل های کتابخانه، در فایل .bashrc مربوط به کاربر yarn که در مسیر /home/yarn/.bashrc قرار دارد مقدار زیر را اضافه کنید:
export HADOOP_PROTOC_PATH=/usr/share/hadoop/share/hadoop/yarn/libپیکربندی های انجام شده را در تمامی ماشین های NodeManager اعمال کنید و سپس از طریق کاربر yarn به ماشین NameNode و پوشه $HADOOP_HOME/sbin وارد شوید. قبل از راه اندازی سرویس های YARN می بایست کاربر yarn را احراز هویت کنید. مانند کاری که برای کاربر hdfs انجام دادیم، دستور زیر را برای این کاربر نیز اجرا نمایید:
kinit -kt /usr/share/hadoop/etc/hadoop/yarn.keytab yarn/masternodeپس از انجام عملیات بالا، به پوشه sbin رفته و دستور زیر را جهت راه اندازی سرویس های YARN یعنی ResourceManager و NodeManager اجرا کنید:
./start-yarn.shادامه دارد ...
فکر میکنم این بخش قدری طولانی شد اما هدف این هست تا شما تجربه واقعی و عملی از اقدامات داشته باشید و از کلی گویی پرهیز شود.
به روزرسانی: بخش سوم این مستند منتشر شد. پس از مطالعه این بخش، به سراغ قسمت بعدی در این لینک بروید.
همچنان با من در بخش های دیگر این مستند همراه باشید و در صورت وجود ابهام و سوال و ارتباط با من می توانید با ایمیل من mobinranjbar1 روی جیمیل و یا لینکدین من مکاتبه کنید.
مطلبی دیگر از این انتشارات
بررسی عملی امنیت زیرساخت های کلان داده - مقدمه و بخش اول
مطلبی دیگر از این انتشارات
بررسی عملی امنیت زیرساخت های کلان داده - بخش پنجم
مطلبی دیگر از این انتشارات
بررسی عملی امنیت زیرساخت های کلان داده - بخش سوم