W domyślnej konfiguracji Apache HBase każdy może czytać ze wszystkich tabel dostępnych w systemie i zapisywać w nich. W przypadku wielu konfiguracji korporacyjnych ten rodzaj zasad jest niedopuszczalny.
Administratorzy mogą konfigurować zapory sieciowe, które decydują, które komputery mogą komunikować się z HBase. Jednak komputery, które mogą przejść przez zaporę sieciową, nadal mogą odczytywać i zapisywać we wszystkich tabelach. Ten rodzaj mechanizmu jest skuteczny, ale niewystarczający, ponieważ HBase nadal nie może rozróżnić wielu użytkowników korzystających z tych samych komputerów klienckich i nadal nie ma szczegółowości w odniesieniu do dostępu do tabeli HBase, rodziny kolumn lub kwalifikatora kolumn.
W tym poście omówimy, w jaki sposób Kerberos jest używany z Hadoop i HBase w celu zapewnienia Uwierzytelniania użytkownika i jak HBase implementuje Autoryzację użytkowników aby nadać użytkownikom uprawnienia do określonych działań na określonym zestawie danych.
Bezpieczny HBase:uwierzytelnianie i autoryzacja
Bezpieczny HBase ma na celu ochronę przed snifferami, nieuwierzytelnionymi/nieautoryzowanymi użytkownikami i atakami sieciowymi. Nie chroni przed autoryzowanymi użytkownikami, którzy przypadkowo usuną wszystkie dane.
HBase można skonfigurować tak, aby zapewniał Uwierzytelnianie użytkownika , co zapewnia, że tylko autoryzowani użytkownicy mogą komunikować się z HBase. System autoryzacji jest zaimplementowany na poziomie RPC i opiera się na warstwie Simple Authentication and Security Layer (SASL), która obsługuje między innymi Kerberos. SASL umożliwia uwierzytelnianie, negocjowanie szyfrowania i/lub weryfikację integralności wiadomości na podstawie połączenia (właściwość konfiguracji „hbase.rpc.protection”).
Kolejny krok po włączeniu Uwierzytelniania użytkownika jest umożliwienie administratorowi zdefiniowania szeregu reguł autoryzacji użytkownika, które zezwalają lub odmawiają określonych działań. System autoryzacji, znany również jako koprocesor kontrolera dostępu lub lista kontroli dostępu (ACL), jest dostępny od HBase 0.92 (CDH4) i daje możliwość zdefiniowania polityki autoryzacji (odczyt/zapis/tworzenie/administracja), z tabelą/rodziną /ziarnistość kwalifikacji, dla określonego użytkownika.
Kerber
Kerberos to sieciowy protokół uwierzytelniania. Został zaprojektowany w celu zapewnienia silnego uwierzytelniania dla aplikacji klient/serwer przy użyciu kryptografii klucza tajnego. Protokół Kerberos wykorzystuje silną kryptografię (AES, 3DES, …), aby klient mógł udowodnić swoją tożsamość serwerowi (i odwrotnie) przez niezabezpieczone połączenie sieciowe. Gdy klient i serwer wykorzystają Kerberos do udowodnienia swojej tożsamości, mogą również szyfrować całą swoją komunikację, aby zapewnić prywatność i integralność danych podczas prowadzenia działalności.
Protokół wymiany biletów
Na wysokim poziomie, aby uzyskać dostęp do usługi przy użyciu protokołu Kerberos, każdy klient musi wykonać trzy kroki:
- Uwierzytelnianie Kerberos:Klient uwierzytelnia się na serwerze uwierzytelniania Kerberos i otrzymuje bilet przyznania biletu (TGT).
- Autoryzacja Kerberos:Klient żąda biletu usługi z serwera przyznającego bilety, który wystawia bilet i klucz sesji, jeśli bilet TGT klienta wysłany z żądaniem jest ważny.
- Żądanie usługi:klient używa biletu usługi do uwierzytelnienia się na serwerze, który świadczy usługę, z której korzysta klient (np. HDFS, HBase,…)
HBase, HDFS, ZooKeeper SASL
Ponieważ HBase zależy od HDFS i ZooKeeper, bezpieczny HBase opiera się na bezpiecznym HDFS i bezpiecznym ZooKeeper. Oznacza to, że serwery HBase muszą utworzyć bezpieczną sesję usługi, jak opisano powyżej, aby komunikować się z HDFS i ZooKeeper.
Wszystkie pliki zapisane przez HBase są przechowywane w HDFS. Podobnie jak w systemach plików Unix, kontrola dostępu zapewniana przez HDFS opiera się na użytkownikach, grupach i uprawnieniach. Wszystkie pliki utworzone przez HBase mają „hbase” jako użytkownika, ale ta kontrola dostępu opiera się na nazwie użytkownika dostarczonej przez system, a każdy, kto może uzyskać dostęp do komputera, może potencjalnie „sudo” jako użytkownik „hbase”. Bezpieczny HDFS dodaje kroki uwierzytelniania, które gwarantują, że użytkownik „hbase” jest zaufany.
ZooKeeper posiada listę kontroli dostępu (ACL) na każdym znode, która umożliwia użytkownikom dostęp do odczytu/zapisu na podstawie informacji o użytkowniku w sposób podobny do HDFS.
HBase ACL
Teraz, gdy nasi użytkownicy są uwierzytelniani przez Kerberos, jesteśmy pewni, że otrzymana nazwa użytkownika jest jednym z naszych zaufanych użytkowników. Czasami nie wystarcza to szczegółowości – chcemy kontrolować, czy określony użytkownik może czytać lub pisać tabelę. Aby to zrobić, HBase zapewnia mechanizm autoryzacji, który umożliwia ograniczony dostęp dla określonych użytkowników.
Aby włączyć tę funkcję, należy włączyć koprocesor kontrolera dostępu, dodając go do pliku hbase-site.xml w ramach klas koprocesora serwera głównego i regionalnego. (Zobacz, jak skonfigurować konfigurację zabezpieczeń HBase tutaj.)
Koprocesor to kod, który działa wewnątrz każdego serwera HBase Region Server i/lub Master. Jest w stanie przechwycić większość operacji (put, get, delete, …) i uruchomić dowolny kod przed i/lub po wykonaniu operacji.
Korzystając z tej możliwości wykonania kodu przed każdą operacją, koprocesor kontrolera dostępu może sprawdzić prawa użytkownika i zdecydować, czy użytkownik może wykonać operację, czy nie.
Powłoka HBase zawiera kilka poleceń, które umożliwiają administratorowi zarządzanie prawami użytkownika:
grant [tabela] [rodzina] [kwalifikator]
unieważnij [tabela] [rodzina] [kwalifikator]
Jak widać, administrator ma możliwość ograniczenia dostępu użytkowników na podstawie schematu tabeli:
- Przyznaj użytkownikowi-W tylko prawa do odczytu tabeli-X/rodziny-Y (
przyznaj 'User-W', 'R', 'Table-X', 'Family-Y'
) - Przyznaj użytkownikowi-W pełne prawa do odczytu/zapisu kwalifikatora-Z (
przyznaj 'User-W', 'RW', 'Table-X', 'Family-Y', 'Qualifier-Z' )
Administrator ma również możliwość przyznawania praw globalnych, które działają na poziomie klastra, takich jak tworzenie tabel, równoważenie regionów, zamykanie klastra itd.:
- Daj użytkownikowi W możliwość tworzenia tabel (
przyznaj 'User-W', 'C'
) - Daj użytkownikowi W możliwość zarządzania klastrem (
przyznaj 'User-W', 'A'
)
Wszystkie uprawnienia są przechowywane w tabeli utworzonej przez koprocesor kontrolera dostępu o nazwie _acl_. Kluczem podstawowym tej tabeli jest nazwa tabeli określona w poleceniu grant. Tabela _acl_ ma tylko jedną rodzinę kolumn, a każdy kwalifikator opisuje szczegółowość uprawnień dla konkretnej tabeli/użytkownika. Wartość zawiera faktycznie przyznane prawa.
Jak widać, polecenia powłoki HBase są ściśle powiązane ze sposobem przechowywania danych. Polecenie grant dodaje lub aktualizuje jeden wiersz, a polecenie unieważnienia usuwa jeden wiersz z tabeli _acl_.
Kontroler dostępu pod maską
Jak wspomniano wcześniej, koprocesor kontrolera dostępu wykorzystuje możliwość przechwycenia każdego żądania użytkownika i sprawdzenia, czy użytkownik ma prawa do wykonywania operacji.
W przypadku każdej operacji kontroler dostępu musi wysłać zapytanie do tabeli _acl_, aby sprawdzić, czy użytkownik ma uprawnienia do wykonania operacji.
Jednak ta operacja może mieć negatywny wpływ na wydajność. Rozwiązaniem tego problemu jest użycie tabeli _acl_ w celu utrwalenia i ZooKeeper w celu przyspieszenia wyszukiwania praw. Każdy serwer regionu ładuje tabelę _acl_ do pamięci i otrzymuje powiadomienia o zmianach przez ZkPermissionWatcher. W ten sposób każdy serwer regionu ma zaktualizowaną wartość za każdym razem, a każde sprawdzenie uprawnień jest wykonywane przy użyciu mapy w pamięci.
Mapa drogowa
Chociaż Kerberos jest stabilnym, dobrze przetestowanym i sprawdzonym systemem uwierzytelniania, funkcja HBase ACL jest nadal bardzo prosta, a jej semantyka wciąż ewoluuje. HBASE-6096 to parasol JIRA jako odniesienie dla wszystkich ulepszeń dostarczanych w wersji 2 funkcji ACL.
Innym otwartym tematem dotyczącym autoryzacji i kontroli dostępu jest implementacja systemu bezpieczeństwa per-KeyValue (HBASE-6222 ), co umożliwi przypisanie różnych wartości w tej samej komórce powiązanej ze znacznikiem zabezpieczającym. To pozwoliłoby na pokazanie określonej informacji na podstawie uprawnień użytkownika.
Wniosek
HBase Security dodaje dwie dodatkowe funkcje, które umożliwiają ochronę danych przed snifferami lub innymi atakami sieciowymi (za pomocą protokołu Kerberos do uwierzytelniania użytkowników i szyfrowania komunikacji między usługami) oraz umożliwiają definiowanie zasad autoryzacji użytkowników, ograniczanie operacji i ograniczanie widoczności danych dla określonych użytkowników.
Matteo Bertozzi jest inżynierem oprogramowania w Spotify i konsultantem HBase w Cloudera.