DevVeri.com

Boğulacaksan büyük veride boğul!

Apache Sentry ile Yetkilendirme

Merhaba arkadaşlar,

Bu yazıda Büyük Veri Güvenlik çözümlerinden Apache Sentry’den bahsetmek istiyorum. Apache Sentry kullanarak hadoop ekosisteminde rol bazlı yetkilendirme ile pekçok Büyük Veri aracı arasında güvenli iletişim sağlanabilir. Şimdi Sentry’nin hive, impala ve hdfs arasındaki çalışma şekillerine bakalım.
Yazını devamında Sentry metadatasına inceleyip, hive üzerinde yetkilendirme uyarlamaları yapıyor olacağız.

1

Hive aracı ile SQL komutları benzeri erişim yapıldığında HDFS’e gittiğimizde Sentry aracı güvenlik denetimlerini yapmakta ve izni olmayan sorguları engellemektedir. Resimde bu aşamayı görebilirsiniz.

2

Impala erişimlerinde ise Impala catalog processi yetkileri hafızasına aldığı için sorgu anında sentry metadatasını sorgulamak yerine,  kendi üzerinde yetki kontrolünü hızlıca yapabilmektedir.

3

HDFS yetkilendirmesinde Sentry’yi tecrübe etmedim ancak bildiğimiz diğer bir çözüm olan ACL ile yetkilendirme metodunun yerini alabilecek kapasitede değil. Hive tablolarının olduğu dosya ve dizinlere erişimde Sentry devreye girer ve erişim kontrolünü yapar.

4

Sentry Veritabanı Modeli:

Sentry veritabanında tablo yapıları incelediğimizde basit bir mimari görmekteyiz.

mysql> use sentry;
Database changed
mysql> show tables;
+------------------------------+
| Tables_in_sentry             |
+------------------------------+
| SENTRY_DB_PRIVILEGE          |
| SENTRY_GROUP                 |
| SENTRY_ROLE                  |
| SENTRY_ROLE_DB_PRIVILEGE_MAP |
| SENTRY_ROLE_GROUP_MAP        |
| SENTRY_VERSION               |
| SEQUENCE_TABLE               |
+------------------------------+

Bu tablolarda önemli olanları özetlersek:

SENTRY_ROLE                  -> Tanımlı roller 
SENTRY_GROUP                 -> Yetkilendirilen işletim sistemi grupları 
SENTRY_ROLE_GROUP_MAP        -> Rol x Grup bilgisi
SENTRY_DB_PRIVELEGE          -> Yetkiler
SENTRY_ROLE_DB_PRIVILEGE_MAP -> Rol x Yetki

Sentry rol bazlı bir yetkilendirme aracı olduğu için kullanıcı bazında yetkilendirme yapılamamakta ve rolleri işletim sistemi bazında gruplarla eşleştirerek, kullanıcılar yetkilendirilmiş olur.
Örnek olarak yetkiler tablosuna baktığımızda:

mysql> SELECT * FROM SENTRY_DB_PRIVILEGE  ;
+-----------------+-----------------+-------------+----------+---------------------+-------------------------------------------------------------------------------+--------+---------------+-------------------+
| DB_PRIVILEGE_ID | PRIVILEGE_SCOPE | SERVER_NAME | DB_NAME  | TABLE_NAME          | URI                                                                           | ACTION | CREATE_TIME   | WITH_GRANT_OPTION |
+-----------------+-----------------+-------------+----------+---------------------+-------------------------------------------------------------------------------+--------+---------------+-------------------+
|               1 | SERVER          | server1     | __NULL__ | __NULL__            | __NULL__                                                                      | *      | 1435230391611 | N                 |
|               6 | URI             | server1     | __NULL__ | __NULL__            | file:///opt/cloudera/parcels/CDH/lib/hive/lib/hive-contrib-1.1.0-cdh5.4.0.jar | *      | 1435758914457 | N                 |
|               7 | URI             | server1     | __NULL__ | __NULL__            | hdfs:///opt/cloudera/parcels/CDH/lib/hive/lib/hive-contrib-1.1.0-cdh5.4.0.jar | *      | 1435759061151 | N                 |
|              11 | TABLE           | server1     | default  | default             | __NULL__                                                                      | select | 1439543565668 | N                 |
|              12 | TABLE           | server1     | default  | defaul              | __NULL__                                                                      | select | 1439543578705 | N                 |
|              14 | DATABASE        | server1     | default  | __NULL__            | __NULL__                                                                      | select | 1439546951486 | N                 |
|              15 | TABLE           | server1     | default  | default             | __NULL__                                                                      | select | 1439547062374 | Y                 |
|              
+-----------------+-----------------+-------------+----------+---------------------+-------------------------------------------------------------------------------+--------+---------------+-------------------+

Gördüğümüz gibi Sentry ile bir jar dosyasına veya tablo / veritabanı için yetkilendirme yapabilmekteyiz.

Tüm gruplara verilen yetkileri raporlamak için aşağıdaki sorguyu kullanabilirsiniz.

mysql > SELECT rolelist.role_name as "ROLE NAME",
               grouplist.group_name AS "GROUP NAME",
               priv.action"ACTION",
               priv.privilege_scope "PRIV SCOPE",
               priv.db_name "DB_NAME",
               priv.table_name "TABLE_NAME",
               priv.uri "URI"
        FROM SENTRY_DB_PRIVILEGE  priv, 
             SENTRY_ROLE_DB_PRIVILEGE_MAP role_priv_map, 
             SENTRY_ROLE_GROUP_MAP role_group_map,
             SENTRY_ROLE  rolelist,SENTRY_GROUP grouplist
        WHERE role_group_map.role_id=rolelist.role_id
              and role_group_map.group_id=grouplist.group_id
              and role_priv_map.role_id=role_group_map.role_id
              and role_priv_map.db_privilege_id=priv.db_privilege_id
              order by 1 ,2 


+------------------------+-------------------------------------+--------+------------+----------+------------+-------------------------------------------------------------------------------+
| ROLE NAME              | GROUP NAME                          | ACTION | PRIV SCOPE | DB_NAME  | TABLE_NAME | URI                                                                           |
+------------------------+-------------------------------------+--------+------------+----------+------------+-------------------------------------------------------------------------------+
| admin_role             | grup1                      | *      | URI        | __NULL__ | __NULL__   | file:///opt/oracle/bigdatasql/bdcell-12.1/jlib/json-serde-1.3.1.jar           |
| admin_role             | grup2                | *      | URI        | __NULL__ | __NULL__   | file:///opt/oracle/bigdatasql/bdcell-12.1/jlib/json-serde-1.3.1.jar           |
...
| role 2              | oracle                              | *      | URI        | __NULL__ | __NULL__   | hdfs:///opt/cloudera/parcels/CDH/lib/hive/lib/hive-contrib-1.1.0-cdh5.4.0.jar |
| role 3     | grup3                      | *      | DATABASE   | db1   | __NULL__   | __NULL__                                                                      |
+------------------------+-------------------------------------+--------+------------+----------+------------+-------------------------------------------------------------------------------+

Şimdi Hive üzerinde Sentry komutlarına bakarsak:

hive> show roles;
+-----------------------------+--+
|            role             |
+-----------------------------+--+
| role1         |
| role2         |
...
...
| admin_role                  |
| deneme                      |
...
+-----------------------------+--+

Bir roldeki yetkilerin listelenmesi:

hive> show grant role admin_role;
+----------------------------------------------------------------------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
|                               database                               | table  | partition  | column  | principal_name  | principal_type  | privilege  | grant_option  |    grant_time     | grantor  |
+----------------------------------------------------------------------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| *                                                                    |        |            |         | admin_role      | ROLE            | *          | false         | 1435230391611000  | --       |
| hdfs:///app/hive_serde/json-serde-1.3.1.jar                          |        |            |         | admin_role      | ROLE            | *          | false         | 1440163479303000  | --       |
| file:///tmp/hive-json-serde/json-serde-aws.jar                       |        |            |         | admin_role      | ROLE            | *          | false         | 1440061254959000  | --       |
| file:///tmp/hive-json-serde/json-serde-1.3.1.jar                     |        |            |         | admin_role      | ROLE            | *          | false         | 1440061245472000  | --       |
| file:///opt/oracle/bigdatasql/bdcell-12.1/jlib/json-serde-1.3.1.jar  |        |            |         | admin_role      | ROLE            | *          | false         | 1440163459313000  | --       |
| hdfs:///tmp/hive-json-serde/json-serde-1.3.1.jar                     |        |            |         | admin_role      | ROLE            | *          | false         | 1440061264598000  | --       |
| hdfs:///tmp/hive-json-serde/json-serde-aws.jar                       |        |            |         | admin_role      | ROLE            | *          | false         | 1440061271254000  | --       |
| file:///opt/oracle/bigdatasql/bdcell-12.1/jlib/json-serde-aws.jar    |        |            |         | admin_role      | ROLE            | *          | false         | 1440163475556000  | --       |
| hdfs:///app/hive_serde/json-serde-aws.jar                            |        |            |         | admin_role      | ROLE            | *          | false         | 1440163482669000  | --       |
+----------------------------------------------------------------------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+

Bir işletim sistemi grubuna verilen yetkilerin listelenmesi:

hive> SHOW ROLE GRANT GROUP `OSgroup1`;
+------------------------+---------------+-------------+----------+--+
|          role          | grant_option  | grant_time  | grantor  |
+------------------------+---------------+-------------+----------+--+
| admin_role             | false         | NULL        | --       |
| role 1                 | false         | NULL        | --       |
+------------------------+---------------+-------------+----------+--+

Örnek bir Sentry yetkilenmesini şu şekilde yapabilirsiniz:

Tanımlı bir veritabanı üzerindeki yetkileri bir gruba devretmek:

hive> create role roleX;
No rows affected (0.072 seconds)
hive > Grant all on database dbX to role roleX;
No rows affected (0.062 seconds)
hive>Grant role roleX to group `OSgroupX`;
No rows affected (0.024 seconds)

Dikkat etmeniz gereken bir nokta, Sentry tanımlamalarını yapan kullanıcının Sentry konfigürasyonlarında yetkili işletim sistemi gruplarına dahil olması gerekiyor. Yoksa aşağıdaki hatayı alabilirsiniz.

hive> SHOW ROLES;
ERROR : Error processing Sentry command: Access denied to erkanul. Server Stacktrace: org.apache.sentry.provider.db.SentryAccessDeniedException: Access denied to erkanul
        at org.apache.sentry.provider.db.service.thrift.SentryPolicyStoreProcessor.list_sentry_roles_by_group(SentryPolicyStoreProcessor.java:450)
        at org.apache.sentry.provider.db.service.thrift.SentryPolicyService$Processor$list_sentry_roles_by_group.getResult(SentryPolicyService.java:953)
        at org.apache.sentry.provider.db.service.thrift.SentryPolicyService$Processor$list_sentry_roles_by_group.getResult(SentryPolicyService.java:938)
        at sentry.org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
        at sentry.org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
        at org.apache.sentry.provider.db.service.thrift.SentryProcessorWrapper.process(SentryProcessorWrapper.java:48)
        at sentry.org.apache.thrift.TMultiplexedProcessor.process(TMultiplexedProcessor.java:123)
        at sentry.org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.SentryGrantRevokeTask. SentryAccessDeniedException: Access denied to erkanul (state=08S01,code=1)

Evet arkadaşlar , yazımız burda sonlanıyor. Apache Sentry ile Büyük Veri dünyasında güvenlik tarafında önemli bir noktayı tamamlayabilirsiniz. Umarım faydalı bir çalışma olmuştur.
İyi çalışmalar.

Kaynak:
https://cwiki.apache.org/confluence/display/SENTRY/Sentry+Tutorial

, , , ,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.