مهندس کلان داده | عضو هیئت مدیره شرکت داده پایای سپهر | عضو هیئت مدیره شرکت مدیریت دارایی راسا
بررسی عملی امنیت زیرساخت های کلان داده - بخش پنجم
در بخش قبل به نصب و پیکربندی ابزار Apache Ranger و پیکربندی هدوپ در آن پرداخته شد. در این بخش به ادامه مباحث مربوطه خواهیم پرداخت.
توجه: اگر بخش قبل را مطالعه نکردید، به این لینک مراجعه کنید.
اتصال سرویس های هدوپ به Ranger Admin
پس از نصب افزونه سرویس های هدوپ می بایست آنها را در بخش Service Manager اضافه کنید. برای اینکار از منوی سرویس HDFS، گزینه + را انتخاب کنید تا صفحه اضافه کردن سرویس جدید باز شود. در صفحه باز شده فیلدهای خواسته شده را به صورت زیر تکمیل نمایید:
فیلد Service Name نام سرویس هست که به دلخواه می توانید انتخاب کنید. دقت کنید که این نام می بایست با نامی که در هنگام نصب افزونه در مقدار REPOSITORY_NAME وارد کردید یکسان باشد.
فیلدهای Username و Password را برابر با نام کاربری و کلمه عبور کاربر سرویسی که برروی سیستم عامل ساخته اید قرار دهید.
فیلد Namenode URL را برابر با آدرس NameNode کلاستر قرار دهید(به طور مثال hdfs://masternode:9000).
فیلد Authorization Enabled را برروی Yes تنظیم کنید.
فیلد Authentication Type را برروی Kerberos تنظیم کنید.
فیلد dfs.datanode.kerberos.principal را برابر با Principal مربوط به کاربر سرویس hdfs قرار دهید(به طور مثال hdfs/masternode@TEST.COM).
فیلد dfs.namenode.kerberos.principal را برابر با Principal مربوط به کاربر سرویس hdfs قرار دهید(به طور مثال hdfs/masternode@TEST.COM).
فیلد dfs.secondary.namenode.kerberos.principal را برابر با Principal مربوط به کاربر سرویس hdfs قرار دهید(به طور مثال hdfs/masternode@TEST.COM).
فیلد RPC Protection Type را برروی Authentication تنظیم کنید.
در بخش Add New Configuration سه مقدار زیر را به صورت مشخص شده تنظیم نمایید:
مقدار policy.download.auth.users را برابر با نام کاربر سرویس(در اینجا hdfs) قرار دهید.
مقدار tag.download.auth.users را برابر با نام کاربر سرویس(در اینجا hdfs) قرار دهید.
مقدار policy.grantrevoke.auth.users را برابر با نام کاربر سرویس(در اینجا hdfs) قرار دهید.
سه مقدار وارد شده در تنظیمات شماره 10، استانداردی است که می بایست برای تقریبا تمامی افزونه ها هنگام تعریف اضافه شوند. این مقادیر نام کاربر سرویس جهت دانلود آخرین سیاست ها توسط افزونه را مشخص می می کنند.
در انتها با کلیک برروی گزینه Test Connection صحت اطلاعات وارد شده را بررسی و سپس برروی گزینه Save کلیک کنید. اگر اطلاعات وارد شده درست باشند و با موفقیت اتصال برقرار گردد، پیغام Connected Successfully به نمایش در خواهد آمد. در غیر اینصورت می بایست مشکل را برطرف نمایید.
پس از تعریف سرویس HDFS به بخش Audit رفته و در سربرگ های Plugins و Plugin Status ارتباط موفقیت آمیز و وضعیت افزونه را مشاهده نمایید. اگر افزونه به درستی در حال کار با Ranger باشد، در سربرگ Plugins لیست ارتباط های موفقیت آمیز افزونه به Ranger را نشان می دهد و ستون Http Response Code برابر با 200 خواهد بود. همچنین در سربرگ Plugin Status هم در لیست، می توانید نام سرویس ساخته شده و آخرین وضعیت به روزرسانی سیاست ها را مشاهده نمایید. در شکل 10 و 11 وضعیت دو سربرگ Plugins و Plugin Status را مشاهده خواهید کرد.


تعریف سیاست های دسترسی در Ranger Admin
به منظور تعریف سیاست های دسترسی، پس از انتخاب سرویس و کلیک برروی آن به صفحه تعریف سیاست ها خواهیم رفت. در هنگام نصب افزونه، سیاست های پیش فرضی تعریف می شود که در برگیرنده کاربر سرویس و کاربر rangerlookup می باشند. به طور مثال در سرویس HDFS دو سیاست به نام all - path و kms-audit-path ساخته می شود که نشان دهنده وجود دسترسی کاربر hdfs به کل مسیرهای HDFS می باشد. کاربر rangerlookup وظیفه شناسایی و خزیدن در مسیرها را بر عهده دارد. به این معنی که این کاربر در هنگام تعریف سیاست جدید، مسیرهای موجود برروی HDFS را شناسایی کرده و برای سهولت در تعریف سیاست مبتنی بر منبع آنها را در بخش موردنظر لیست می کند.
برای تعریف سیاست جدید برای کاربر خاص غیر سیستمی، می بایست آن کاربر در Ranger Admin تعریف شود. اینکار توسط ابزار Ranger UserSync به صورت خودکار انجام می گیرد. اما در صورت بروز مشکل در این ابزار و یا عدم استفاده از آن می بایست کاربر موردنظر در بخش Settings تعریف شود. کاربر موردنظر اگر به صورت خودکار ساخته شود، در ستون User Source مقدار External قرار می گیرد و اگر به صورت دستی ساخته شود مقدار Internal تنظیم می شود. لازم به ذکر است، پیش از ساخت کاربر می بایست گروه کاربری آن ساخته شود. سپس می توان با مراجعه به صفحه سیاست های سرویس موردنظر، برروی Add New Policy کلیک کرده و مقادیر زیر را به شکل مشخص شده تنظیم کنید:
در بخش Policy Details مقدار Policy Name را برابر با نامی دلخواه برای سیاست جدید قرار دهید.
در بخش Policy Details مقدار Resource Path را برابر با آدرس مسیری که قصد دارید برای آن سیاست گزاری کنید قرار دهید.
در بخش Allow Conditions نام کاربر، نام گروه کاربری و یا نام نقش کاربر را وارد کرده و در بخش Permissions نوع دسترسی را انتخاب نمایید.
در انتها برروی گزینه Add جهت ذخیره کلیک نمایید. پس از انجام اینکار در لیست سیاست ها، سیاست ساخته شده را می توانید مشاهده نمایید. اگر به بخش Audit و سربرگ Plugin Status مراجعه نمایید، در ستون Last Update مربوط به سطر افزونه سرویس HDFS مشاده خواهید کرد که در چند لحظه پیش سیاست های سرویس HDFS به روزرسانی شده است.
در لیست سیاست های موردنظر امکاناتی از قبیل جستجوی سیاست، نمایش اطلاعات، ویرایش و حذف سیاست موردنظر وجود دارد که می توانید از آنها استفاده کنید.
فرآیند تعریف سیاست جدید برای انواع دیگر سرویس ها هم مشابه سرویس HDFS می باشد و تفاوت در نوع دسترسی ها می باشد. دسترسی های مربوط به سرویس Hive و YARN را می توانید بررسی نمایید.
نصب و راه اندازی افزونه Spark SQL
نکته: لینک های موردنیاز در این بخش به دلیل محدودیت های ویرگول، در مخزن گیت هاب با نام links قرار گرفته است.

در Ranger هیچ افزونه رسمی برای Spark ارائه نشده است و می بایست به صورت دستی، با استفاده از افزونه spark-ranger اتصال بین Spark و Ranger برقرار شود. لازم به ذکر است اتصال Spark به معنی اتصال سیاست گزاری های مربوط به جداول و پایگاه داده های موجود برروی Spark SQL می باشد که از طریق کتابخانه Hive صورت می پذیرد.
پیش از شروع فرآیند نصب، فرض می شود که اسپارک در زیرساخت نصب شده و راه اندازی شده و همچنین لایه امنیتی Kerberos برروی آن فعال شده باشد.
در ابتدا نیاز است که سورس کد افزونه spark-ranger را از لینک شماره 1 موجود در فایل links مخزن دانلود و سپس با استفاده از دستور زیر توسط Maven آنرا build کنید:
mvn clean package -Pspark-2.4 -Pranger-2.0 -DskipTestsپس از build افزومه موردنظر، در پوشه target فایل spark-ranger-1.0-SNAPSHOT.jar ساخته می شود که نیاز است آنرا به پوشه $SPARK_HOME/jars منتقل کنید. پس از انجام اینکار فایل تنظیمات spark-defaults.conf را با یکی از ویرایشگرهای متنی برای ویرایش باز کنید و مقادیر زیر را در آن وارد کنید:
spark.sql.extensions org.apache.ranger.authorization.spark.authorizer.RangerSparkSQLExtension
spark.driver.extraClassPath /usr/share/spark/jars/spark-ranger-1.0-SNAPSHOT./usr/share/spark/jars/gethostname4j-0.0.3./usr/share/spark/jars/jna-5.5.0.jar
در خط شماره 1 کلاس مربوط به افزونه را به اسپارک معرفی و در خط شماره 2 کتابخانه های موردنیاز آن کلاس را مقداردهی می کنیم. لازم به ذکر است افزونه spark-ranger نیاز به دو وابستگی gethostname4j و jna دارد که می توانید از لینک شماره 2 و شماره 3 موجود در فایل links مخزن دانلود نمایید. این دو فایل وابستگی نیز می بایست در مسیر $SPARK_HOME/jars قرار گیرد.
پس از انجام عملیات بالا، در مسیر $SPARK_HOME/conf فایلی به نام ranger-spark-security.xml بسازید و آنرا با یکی از ویرایشگرهای متنی برای ویرایش باز کنید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
در خط شماره 3 آدرس کامل مربوط به Ranger Admin را وارد می کنیم و در خط 7 نام سرویسی که برروی Ranger Admin خواهیم ساخت را مقداردهی می کنیم. همچنین در خط 11 مسیر ذخیره سازی موقت سیاست های درخواستی تکرارپذیر را تنظیم می کنیم. در خط 15 مدت زمان دریافت سیاست ها توسط افزونه را به میلی ثانیه وارد می کنیم و در خط شماره 19 نیز کلاس جاوایی درخواست REST جهت دریافت آخرین سیاست ها از طریق Ranger Admin را تعیین می کنیم.
این فایل را ذخیره کنید. فایلی به نام ranger-spark-audit.xml برای پیکربندی قابلیت گزارشات بازرسی در همان مسیر می بایست بسازیم و آنرا تنظیم کنیم. اگر در گذشته سرویس Hive را برروی Ranger Admin فعال کرده اید، کافی است این فایل را به مسیر $SPARK_HOME/conf کپی نمایید و مقادیر مربوط به فایل موردنظر در مخزن گیت هاب این مستند را قرار دهید.
در خط شماره 2 قابلیت ایجاد گزارش بازرسی را فعال می کنیم. در خط 6 به افزونه اسپارک می گوییم گزارشات را میخواهیم به Solr بفرستیم. در خط 10 مقدار حداکثر حجم صف ارسال داده به Solr را مقداردهی می کنیم و در خط شماره 14 دوره زمانی تازه گردانی داده های ارسالی به Solr را به میلی ثانیه تعیین می کنیم. همچنین در خط شماره 18 آدرس کامل Core مربوط به Ranger را وارد می کنیم. در خط شماره 30 و 34 هم به ترتیب نام کاربری و کلمه عبور کاربر سیستم مالک سرویس Solr را وارد می کنیم. در خط شماره 38 استفاده و یا عدم استفاده از SolrCloud را تعیین می کنیم که در اینجا برابر با NONE است و در خط شماره 42 هم مسیر قرارگیری موقت داده های ارسالی به Solr تعیین می گردد.
اگر در گذشته افزونه Hive را نصب نکرده اید، فایل موردنظر را بسازید و مقادیر موردنیاز ذکر شده در بالا را در آن قرار دهید. پس از انجام اینکار اسپارک و سرویس Thrift Server را دوباره راه اندازی نمایید تا تنظیمات جدید اعمال شود.
پیش از تعریف سرویس Spark SQL برروی Ranger Admin می بایست کتابخانه های Hive موجود برروی Ranger Admin به روزرسانی گردند. اگر این مرحله انجام نشود، امکان اتصال موفقیت آمیز از طریق Test Connection، امکان لیست کردن پایگاه داده ها، جداول و ستون های آنها به صورت خودکار وجود نخواهد داشت. فایل های لیست شده در زیر را از مسیرهای مشخص شده به مسیر $RANGER_HOME/ews/webapp/WEB-INF/lib منتقل نمایید:
hive-exec-1.2.1.spark2.jar (به دلیل استفاده Ranger از کتابخانه هدوپ نسخه 3، این فایل در بسته اسپارک موجود نیست و می بایست از لینک شماره 4 موجود در فایل links مخزن دانلود کنید).
hive-jdbc-1.2.1.spark2.jar (از مسیر $SPARK_HOME/jars کپی کنید).
hive-metastore-1.2.1.spark2.jar (از مسیر $SPARK_HOME/jars کپی کنید).
hive-service-1.2.1.jar (از لینک شماره 5 موجود در فایل links مخزن دانلود نمایید).
پس از انجام اینکار، یکبار Ranger Admin را با دستور زیر دوباره راه اندازی کنید:
ranger-admin restartدر انتها، یک سرویس از نوع Hive در Ranger Admin بسازید و مقادیر زیر را مقداردهی کنید(بخشی از مقادیر این بخش مشابه سرویس HDFS می باشند که می توانید مشابه آنها مقداردهی کنید):
فیلد Service Name نام سرویس هست که به دلخواه می توانید انتخاب کنید. دقت کنید که این نام می بایست با نامی که در هنگام ساخت فایل ranger-spark-security.xml وارد کردید یکسان باشد.
فیلدهای Username و Password را برابر با نام کاربری و کلمه عبور کاربر سرویسی که برروی سیستم عامل ساخته اید قرار دهید.
فیلد jdbc.url را برابر با آدرس اتصال JDBC مربوط به Thrift Server قرار دهید(به طور مثال jdbc:hive2://masternode:10000/default;principal=hive/masternode@TEST.COM).
در بخش Add New Configuration سه مقدار زیر را به صورت مشخص شده تنظیم نمایید:
مقدار policy.download.auth.users را برابر با نام کاربر سرویس(در اینجا hive) قرار دهید.
مقدار tag.download.auth.users را برابر با نام کاربر سرویس(در اینجا hive) قرار دهید.
مقدار policy.grantrevoke.auth.users را برابر با نام کاربر سرویس(در اینجا hive) قرار دهید.
در انتها با کلیک برروی گزینه Test Connection صحت اطلاعات وارد شده را بررسی و سپس برروی گزینه Save کلیک کنید. اگر اطلاعات وارد شده درست باشند و با موفقیت اتصال برقرار گردد، پیغام Connected Successfully به نمایش در خواهد آمد. در غیر اینصورت می بایست مشکل را برطرف نمایید.
نصب و راه اندازی Livy و اجرای مثال مرتبط
جهت آزمایش و انجام یک مثال برروی Spark SQL نیاز است تا ابزار Livy را جهت انجام درخواست راه دور برروی زیرساخت نصب و راه اندازی کنیم. آخرین نسخه Livy را از سایت رسمی دانلود نمایید و در مسیر دلخواه(به طور مثال /opt) استخراج و مالک پوشه و دسترسی آنرا به کاربر livy تغییر دهید.
پیش از تنظیم پیکربندی Livy می بایست Principal مربوط به Livy برروی Kadmin تعریف و فایل کلید آن را در مسیر تنظیمات Livy قرار دهیم. همچنین به علت ارتباط و استفاده Livy از HTTP می بایست فایل کلید آن نیز در مسیر تنظیمات این ابزار موجود باشد. به دلیل انجام این فرآیند در گذشته از مرور مجدد آن خودداری و به پیکربندی Livy می پردازیم.
فایل livy.conf در مسیر $LIVY_HOME/conf را با یکی از ویرایشگرهای متنی جهت ویرایش باز کنید و مقادیر زیر را تنظیم نمایید:
مقدار livy.server.host را برابر با نام میزبان ابزار Livy قرار دهید(در اینجا masternode).
مقدار livy.server.port را برابر با شماره پورت دلخواه خود قرار دهید(به صورت پیش فرض 8998 انتخاب می شود).
مقدار livy.impersonation.enabled را برابر با true قرار دهید. تنظیم این مقدار باعث می شود تا Livy بتواند از امکان proxyUser استفاده کند.
مقدار livy.repl.enable-hive-context را برابر با true قرار دهید تا Livy بتواند هنگام کار با Spark SQL از دستورات Hive به صورت کامل پشتیبانی کند.
مقدار livy.server.auth.type را جهت فعال سازی مکانیزم برابر با مقدار Kerberos قرار دهید.
مقدار livy.server.auth.kerberos.principal را برابر با Principal مربوط به HTTP قرار دهید(به طور مثال HTTP/masternode@TEST.COM).
مقدار livy.server.auth.kerberos.keytab را برابر با مسیر فایل کلید Principal مربوط به HTTP قرار دهید.
مقدار livy.server.launch.kerberos.principal را وارد و برابر با Principal مربوط به کاربر livy قرار دهید.
مقدار livy.server.launch.kerberos.keytab را وارد و برابر با آدرس فایل کلید مربوط به کاربر livy قرار دهید.
پس از انجام اینکار با مراجعه به مسیر bin دستور زیر را جهت راه اندازی Livy اجرا کنید:
./livy-serverحال فرض کنید کاربری می خواهد از راه دور برروی زیرساخت، عملیات پردازشی و یا ذخیره سازی را انجام دهد. در ابتدا این کاربر موجود در شبکه می بایست در kadmin تعریف گردد و مجوز احراز هویت دریافت نماید. نام کاربر موردنظر را به طور مثال mobin فرض کنید. در ابتدا این کاربر را به صورت زیر در Kadmin تعریف می کنیم:
addprinc mobin/masternodeپس از انجام اینکار رمز عبور دلخواه از شما درخواست می شود که این رمز را می بایست به کاربر mobin بدهید و یا فایل کلید را تولید و برای او ارسال کنید تا بتواند خود را احراز هویت کند.
در مرحله بعد کاربر mobin را می بایست واجد شرایط استفاده از پایگاه داده ها و منابع موجود برروی سرویس های HDFS، Spark SQL و YARN کنید. با مراجعه به Ranger Admin و تعریف سیاست مربوط به این کاربر، به او اعطای مجوز سرویس کنید. به طور مثال این کاربر می تواند تنها به پایگاه داده dbtest و مسیر مربوط به خود برروی HDFS دسترسی داشته باشد. فرآیند انجام اینکار قبلا توضیح داده شده است.
لازم به ذکر است جهت استفاده livy از امکان proxyUser می بایست تنظیمات زیر برروی فایل core-site.xml هدوپ موجود باشد:
<property>
<name>hadoop.proxyuser.livy.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.livy.groups</name>
<value>*</value>
</property>
همچنین دقت کنید که اگر Spark برروی YARN تنظیم شده باشد، کاربری که میخواهد از امکان proxyUser استفاده کند می بایست در تمامی ماشین های کلاستر به صورت سیستمی تعریف شده باشد.
کاربر موردنظر با استفاده از نام Principal و رمزعبور خود یک kinit به صورت زیر برروی سیستم خود انجام می دهد تا بلیط خود را در حافظه موقت ذخیره کند و از آن برای ارسال درخواست خود استفاده کند. به صورت زیر:
kinit mobin/masternodeپس از انجام دستور بالا، کاربر mobin جهت استفاده از زیرساخت کلان داده احراز هویت شده است. درخواست خود را به Livy به صورت زیر ارسال می کند:
curl -ivf -negotiate -u : “http://masternode:8998/sessions” -header “Content-Type: application/json” -request POST -data ‘{“kind”:”sql”,”proxyUser”:”mobin”}’با اجرای دستور بالا به Livy می گوید من کاربر احراز هویت شده mobin میخواهم برروی Spark SQL یک Session دریافت کنم و عملیات پردازشی را برروی آن انجام دهم. اتفاقاتی که ممکن است برای این درخواست صورت بگیرد به شرح زیر است:
کاربر mobin یک کاربر احراز هویت شده می باشد و دستور بالا کد 200 را بر میگرداند و Session موردنظر برروی Spark ایجاد می شود.
کاربر mobin احراز هویت نشده است و یا چنین کاربری وجود ندارد. در این زمان، خطایی در خروجی دستور بالا به صورت زیر رخ می دهد و اعلام می کند که هیچ هویتی پیدا نشده است و کد خطای 401 را بر میگرداند:
Gss_init_sec_context() failed : No Kerberos credentials available (default cache : FILE:/tmp/krb5cc_1000)
حال فرض کنید کاربر mobin احراز هویت شده است اما درخواست خود را به این صورت ارسال می کند و میخواهد از مجوز دیگران استفاده و جعل هویت کند:
curl -ivf -negotiate -u : “http://masternode:8998/sessions” -header “Content-Type: application/json” -request POST -data ‘{“kind”:”sql”,”proxyUser”:”admin”}’اتفاقی که برای درخواست بالا می افتد این است که با خطای 403 روبرو می شود و نشان می دهد که هویتی که این درخواست را ارسال کرده است، خود واقعی کاربر admin نیست و جعل هویت صورت گرفته است.
در مثال انجام شده تفاوت عملی بین احراز هویت و اعطای مجوز را نشان می دهد و نقش مهم وجود مکانیزم Kerberos در کنار Ranger اثبات می شود. اگر به تنهایی Ranger را نصب و راه اندازی کنیم، هر کاربری می تواند جعل هویت کند و خود را به جای دیگری معرفی کند. مکانیزم Kerberos به تنهایی هم توانایی تفکیک مجوز سطح سرویس را ندارد و زمانی که کاربر احراز هویت می شود در واقع مجوز انجام هرکاری را دارا می باشد.
ادامه دارد ...
با من در بخش های دیگر این مستند همراه باشید و در صورت وجود ابهام و سوال و ارتباط با من می توانید با ایمیل من mobinranjbar1 روی جیمیل و یا لینکدین من مکاتبه کنید.
مطلبی دیگر از این انتشارات
بررسی عملی امنیت زیرساخت های کلان داده - بخش چهارم
مطلبی دیگر از این انتشارات
بررسی عملی امنیت زیرساخت های کلان داده - بخش دوم
مطلبی دیگر از این انتشارات
بررسی عملی امنیت زیرساخت های کلان داده - مقدمه و بخش اول