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.
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.
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.
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.
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
Hive İç İçe Sorgu Kullanımı Basit Lineer Regresyon