Cấu hình Kerberos Authentication cho cụm HBase
Để bảo vệ cụm HBase, bước đầu tiên là tích hợp Kerberos vào HBase và Hadoop HDFS. Kerberos sẽ đảm bảo mọi yêu cầu truy cập đều phải xác thực qua KDC (Key Distribution Center).
Chúng ta cần chỉnh sửa file cấu hình hbase-site.xml để bật chế độ bảo mật và chỉ định đường dẫn đến file krb5.conf của Kerberos.
File cấu hình nằm tại: /etc/hbase/conf/hbase-site.xml
Nội dung file hbase-site.xml hoàn chỉnh (bao gồm các phần cũ đã có và phần mới thêm cho Kerberos):
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.info.address</name>
<value>0.0.0.0:16010</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>namenode, node1, node2</value>
</property>
<!-- Bật bảo mật Kerberos -->
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<!-- Cấu hình đường dẫn đến krb5.conf -->
<property>
<name>hbase.kerberos.keytab</name>
<value>/etc/security/keytabs/hbase.service.keytab</value>
</property>
<property>
<name>hbase.kerberos.principal</name>
<value>hbase/_HOST@YOUR.REALM.COM</value>
</property>
<!-- Cấu hình HDFS Kerberos -->
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
</configuration>
Sau khi lưu file, bạn cần khởi động lại dịch vụ HBase Master và RegionServers để áp dụng cấu hình. Kết quả mong đợi là HBase từ chối kết nối không có token Kerberos hợp lệ.
Cấu hình Hadoop để hỗ trợ Kerberos
HBase phụ thuộc vào HDFS, do đó file core-site.xml của Hadoop cũng cần được cấu hình để sử dụng Kerberos.
File cấu hình nằm tại: /etc/hadoop/conf/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:8020</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.kerberos.keytab</name>
<value>/etc/security/keytabs/hdfs.keytab</value>
</property>
<property>
<name>hadoop.kerberos.principal</name>
<value>hdfs/_HOST@YOUR.REALM.COM</value>
</property>
</configuration>
Khởi động lại HDFS (NameNode và DataNode) sau khi thay đổi. Kết quả mong đợi: HDFS yêu cầu xác thực Kerberos cho mọi truy cập file.
Tạo Keytab và cấu hình Principal cho HBase Services
Để các dịch vụ HBase (Master, RegionServer) có thể tự động xác thực với KDC mà không cần nhập mật khẩu, chúng ta cần tạo file Keytab chứa secret key của Principal.
Trên máy chủ KDC (thường là máy quản lý hoặc NameNode), thực hiện lệnh sau để tạo Keytab cho HBase. Thay thế YOUR.REALM.COM bằng Realm thực tế của bạn.
kadmin.local -q "addprinc -randkey hbase/_HOST@YOUR.REALM.COM"
kadmin.local -q "ktadd -k /etc/security/keytabs/hbase.service.keytab hbase/_HOST@YOUR.REALM.COM"
Lệnh đầu tiên tạo principal với key ngẫu nhiên. Lệnh thứ hai xuất key đó ra file keytab. Kết quả mong đợi: File keytab được tạo thành công và thông báo "Entry for principal hbase/_HOST@YOUR.REALM.COM added to keytab".
Sao chép và phân quyền Keytab
File keytab cần được sao chép đến tất cả các node trong cụm HBase (Master và RegionServers) và đặt quyền sở hữu cho user hbase.
scp /etc/security/keytabs/hbase.service.keytab hbase@node1:/etc/security/keytabs/
scp /etc/security/keytabs/hbase.service.keytab hbase@node2:/etc/security/keytabs/
Tại từng node, thực hiện lệnh chmod để đảm bảo an toàn:
chown hbase:hbase /etc/security/keytabs/hbase.service.keytab
chmod 400 /etc/security/keytabs/hbase.service.keytab
Quyền 400 đảm bảo chỉ user hbase mới đọc được file này, ngăn chặn rủi ro rò rỉ key. Kết quả mong đợi: File keytab có quyền đọc chỉ cho owner.
Verify Kerberos Authentication
Để kiểm tra xem HBase đã nhận diện Kerberos chưa, hãy thử kết nối bằng lệnh hbase shell mà không có ticket.
hbase shell
Kết quả mong đợi: Lệnh sẽ bị từ chối với lỗi "Authentication failed" hoặc "GSSException: No valid credentials provided".
Để kết nối thành công, bạn phải cấp ticket trước bằng lệnh kinit:
kinit -kt /etc/security/keytabs/hbase.service.keytab hbase/_HOST@YOUR.REALM.COM
hbase shell
Kết quả mong đợi: Shell HBase mở ra thành công, hiển thị prompt hbase(main):000:0>.
Thiết lập Access Control Lists (ACL) để phân quyền người dùng
Khi đã bật bảo mật, HBase cho phép phân quyền chi tiết (Read, Write, Create, Admin) cho từng user trên từng table hoặc column family.
Trước tiên, cần bật tính năng ACL trong file cấu hình hbase-site.xml (nếu chưa làm ở phần trước) bằng property hbase.security.authorization đặt giá trị true.
Tạo User và cấp quyền
Sử dụng lệnh grant trong HBase Shell để cấp quyền. Cú pháp: grant 'username', 'permissions', 'table_name'.
Quyền có sẵn: R (Read), W (Write), C (Create), A (Admin), T (Trigger).
grant 'user1@YOUR.REALM.COM', 'RW', 'my_table'
grant 'admin_user@YOUR.REALM.COM', 'RWCA', 'my_table'
Để cấp quyền cụ thể cho một Column Family (ví dụ: user1 chỉ được đọc column family 'cf1'):
grant 'user1@YOUR.REALM.COM', 'R', 'my_table:cf1'
Kết quả mong đợi: Không có lỗi xuất hiện, lệnh thực thi xong.
Xóa quyền và xem danh sách quyền
Sử dụng lệnh revoke để thu hồi quyền:
revoke 'user1@YOUR.REALM.COM', 'W', 'my_table'
Sử dụng lệnh whoami để xem principal hiện tại đang đăng nhập:
whoami
Sử dụng lệnh list_permissions để xem ai có quyền gì trên table:
list_permissions 'my_table'
Kết quả mong đợi: Danh sách các user và quyền tương ứng được in ra màn hình. Nếu user không có quyền, khi họ thực hiện thao tác sẽ bị lỗi "Access Denied".
Bật tính năng mã hóa dữ liệu (Encryption) cho Column Family
HBase hỗ trợ mã hóa dữ liệu (Encryption) khi lưu trữ trên HDFS để bảo vệ dữ liệu nghỉ (data at rest). Chúng ta sử dụng AES-256-CBC.
Để mã hóa một Column Family, ta phải tạo Table mới hoặc sửa Column Family hiện có với thuộc tính mã hóa. Lưu ý: Tính năng này yêu cầu HBase được cấu hình với module hbase-cipher.
Tạo Table với Column Family mã hóa
Trong HBase Shell, tạo table với tham số mã hóa:
create 'secure_table', 'cf', {ENCRYPT => 'AES/CBC/PKCS5Padding', KEY => 'my_secret_key'}
Trong đó KEY là chuỗi ký tự làm khóa mã hóa. Trong môi trường production, nên sử dụng keyProvider thay vì hardcode key.
Để cấu hình KeyProvider (nơi lưu trữ key an toàn), thêm vào hbase-site.xml:
<property>
<name>hbase.crypto.keyprovider</name>
<value>org.apache.hadoop.hbase.security.encryption.KeyProvider</value>
</property>
<property>
<name>hbase.crypto.keyprovider.path</name>
<value>hdfs://namenode:8020/hbase/keyprovider.key</value>
</property>
Sau khi cấu hình, tạo lại table hoặc tạo column family mới:
create 'secure_table2', {NAME => 'cf_enc', ENCRYPT => 'AES/CBC/PKCS5Padding', KEY => 'encrypted_key_123'}
Kết quả mong đợi: Table được tạo thành công. Khi dữ liệu được ghi vào column family này, nó sẽ được mã hóa trước khi lưu vào HDFS.
Verify mã hóa
Để kiểm tra xem dữ liệu có được mã hóa không, hãy truy xuất dữ liệu thô từ HDFS và xem nội dung file storefile.
hdfs dfs -cat /hbase/secure_table2/region1/.../hbase.regionserver.wal
Nếu bạn thấy dữ liệu dạng binary không thể đọc được (garbage characters), nghĩa là mã hóa đang hoạt động. Khi đọc qua HBase Shell, dữ liệu sẽ được giải mã tự động và hiển thị bình thường.
get 'secure_table2', 'row1', 'cf_enc:col1'
Kết quả mong đợi: Giá trị dữ liệu hiển thị rõ ràng trong shell, chứng tỏ quá trình giải mã thành công.
Cấu hình HTTPS cho giao diện quản lý HBase
Giao diện Web UI của HBase (HBase Master) mặc định chạy trên HTTP. Để bảo mật, cần chuyển sang HTTPS và cấu hình SSL/TLS.
Bước đầu tiên là tạo Keystore (Java KeyStore - JKS) chứa chứng chỉ SSL. Sử dụng công cụ keytool có sẵn trong JDK.
keytool -genkeypair -alias hbase-master -keyalg RSA -keysize 2048 -keystore /etc/hbase/conf/keystore.jks -storepass securepassword -keypass securepassword
Khi được hỏi thông tin, nhập:
- First and last name: hbase-master
- Organizational unit: HBase
- Organization: Your Company
- City: Your City
- State: Your State
- Country Code: VN
Nội dung file hbase-site.xml cần thêm các property sau để cấu hình HTTPS:
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<property>
<name>hbase.master.info.address</name>
<value>0.0.0.0:16010</value>
</property>
<property>
<name>hbase.master.info.ssl.enabled</name>
<value>true</value>
</property>
<property>
<name>hbase.master.info.ssl.keystore.path</name>
<value>/etc/hbase/conf/keystore.jks</value>
</property>
<property>
<name>hbase.master.info.ssl.keystore.password</name>
<value>securepassword</value>
</property>
<property>
<name>hbase.master.info.ssl.keystore.key.password</name>
<value>securepassword</value>
</property>
Tương tự, nếu bạn muốn bảo mật giao diện của RegionServer (HBase RegionServer UI), hãy thêm các property tương tự với tiền tố hbase.regionserver.info..
<property>
<name>hbase.regionserver.info.port</name>
<value>16030</value>
</property>
<property>
<name>hbase.regionserver.info.ssl.enabled</name>
<value>true</value>
</property>
<property>
<name>hbase.regionserver.info.ssl.keystore.path</name>
<value>/etc/hbase/conf/keystore.jks</value>
</property>
Sau khi lưu file, khởi động lại HBase Master và RegionServers.
Verify HTTPS
Mở trình duyệt và truy cập vào địa chỉ https://<master-hostname>:16010.
Kết quả mong đợi: Trình duyệt báo cảnh báo chứng chỉ tự ký (Self-signed certificate) nếu bạn chưa dùng CA công cộng. Sau khi chấp nhận rủi ro, giao diện HBase Master hiện ra bình thường qua giao thức HTTPS. Nếu bạn truy cập qua http://...:16010, trình duyệt sẽ báo lỗi "Connection Refused" hoặc "Unable to connect".
Để kiểm tra bằng lệnh command line:
curl -k https://master-hostname:16010/master_status
Kết quả mong đợi: Trả về nội dung HTML hoặc JSON của trang quản lý. Nếu không có flag -k, curl sẽ báo lỗi SSL certificate verification failed.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với Apache HBase trên Ubuntu 24.04
« Phần 6: Tích hợp HBase với Ecosystem: Phoenix và Spark
Phần 8: Giám sát hiệu năng, Troubleshooting và tối ưu hóa cụm »