
Apache Zeppelin adalah sebuah editor kode berbasis web atau dikenal dengan sebutan notebook. Notebook digunakan untuk memudahkan dalam melakukan analisa data secara interaktif dan story telling menggunakan data. Apache Zeppelin mendukung berbagai bahasa pemrograman dan scripting seperti SQL. Python, Scala dan masih banyak lagi.
Apache Zeppelin juga mendukung penggunaan untuk lebih dari satu user (multiple-user environment). Namun dalam kondisi default, Apache Zeppelin mengeksekusi kode atau job ke dalam hadoop cluster menggunakan user zeppelin, walaupun ketika masuk ke dalam aplikasi Zeppelin telah menggunakan user account masing-masing. Hal ini tentu tidak sesuai dengan kaidah keamanan yang umum diterapkan.
Untuk memenuhi kaidah data governance dan keamanan, setiap job, kode, atau aplikasi harus dijalankan menggunakan user credential yang sesuai agar setiap pengguna hanya mengakses sesuai dengan hak yang telah diberikan. Hak ini mencakup otorisasi ke folder dan file tertentu, privilege untuk create, akses, maupun edit tabel dan database, bahkan sampai alokasi resource oleh YARN. Hal ini akan sulit dilakukan jika semua job atau kode dijalankan dengan menggunakan satu user account yang sama. Fitur user impersonation pada Apache Zeppelin memungkinkan untuk melakukan eksekusi kode ke dalam hadoop cluster menggunakan masing-masing user account.
Dalam artikel ini akan dibahas mengenai cara melakukan konfigurasi user impersonation pada interpreter Shell, Hive dan Spark. Pada tutorial ini Apache Zeppelin terinstall pada Yava247 Data Management Platform. Akan tetapi semua langkah-langkah yang dijelaskan dapat diterapkan untuk Apache Zeppelin pada umumnya.
Membuat User Account
Tutorial ini menggunakan Yava247 Data Management Platform yang tidak dikonfigurasi pada secure cluster. Sebelum membuat user account pada Zeppelin pastikan :
- Buat user account pada OS yang akan digunakan pada Apache Zeppelin. Misalkan user account yang dibuat adalah user01
- Pastikan user01 memiliki hak akses HDFS dan memiliki home directory pada HDFS
- Pastikan user01 memiliki hak untuk mengakses Apache Hive
- Pastikan user01 memiliki hak untuk mengakses Apache Spark
Membuat User Account Pada Zeppelin
Sebelum membuat user account pada zeppelin, kita membutuhkan shiro-tools-hasher-1.3.2-cli.jar untuk membuat password yang terenkripsi. File tersebut dapat didownload melalui link ini.
Untuk membuat password dengan menggunakan tools ini dapat dilakukan dengan perintah dibawah ini
java -jar shiro-tools-hasher-1.3.2-cli.jar -p
Password akan terenkripsi menggunakan SHA-256 dan bentuknya seperti berikut
$shiro1$SHA-256$500000$qyhwv2FYjn0pPs8nme62rg==$IbFf9/e9BISg4Bq721N0t1KDUhWm5H0ZZf9KccSJBcw=
Untuk membuat user account baru pada Zeppelin dapat dilakukan dengan cara mengedit file shiro.ini. Pada Yava247 Data Management Platform dapat dilakukan melalui Apache Ambari dengan memilih Zeppelin Notebook > Configs > Advanced zeppelin-shiro-ini

Format umum untuk definisi user account pada Zeppelin adalah:
<user-name> = <encrypted-password>,<role>
Untuk menambahkan user01 dengan role1, tambahkan kode berikut pada bagian user pada konfigurasi shiro.ini
user01 = $shiro1$SHA-256$500000$qyhwv2FYjn0pPs8nme62rg==$IbFf9/e9BISg4Bq721N0t1KDUhWm5H0ZZf9KccSJBcw=,role1
Setelah disimpan, dan merestart service Apache Zeppelin, masuk ke Apache Zeppelin notebook dengan menggunakan user01 yang baru dibuat tadi.
Buat notebook baru untuk menguji user account yang digunakan dengan menggunakan shell interpreter

Terlihat diatas bahwa user account yang digunakan untuk operasi shell bukan user01, melainkan zeppelin. Ini menandakan bahwa Zeppelin belum dikonfigurasi untuk menggunakan user impersonation
User Impersonation Untuk Shell Interpreter
Untuk mengaktifkan user impersonation, edit file zeppelin-env.sh. Pada Yava247 Data Management Platform dapat dilakukan melalui Apache Ambari, yaitu dengan memilih Services > Zeppelin Notebook > Configs > Advanced zeppelin-env
Tambahkan kode berikut pada bagian bawah
export ZEPPELIN_IMPERSONATE_CMD='sudo -H -u ${ZEPPELIN_IMPERSONATE_USER} bash -c '

Simpan perubahannya dan restart Apache Zeppelin.
Tambahkan hak akses untuk melakukan sudoers pada user account yang digunakan untuk mengaktifkan Apache Zeppelin server, pada artikel ini menggunakan zeppelin. Tambahkan kode berikut pada file /etc/sudoers
zeppelin ALL=(ALL) NOPASSWD: ALL
Login ke Apache Zeppelin notebook menggunakan user admin, dan lakukan perubahan pada opsi shell interpreter:
- Binding option = per user / isolated
- User impersonate = true
Pastikan juga untuk properti shell interpreter:
- working.directory.user.home = true
Simpan perubahan tersebut dan restart shell interpreter.
Lakukan uji coba dengan login ke Apache Zeppelin notebook, dan jalankan perintah berikut dengan menggunakan shell interpreter

User Impersonation Untuk Hive Interpreter
Hive interpreter merupakan turunan dari JDBC interpreter yang khusus dikonfigurasi untuk terkoneksi pada Apache Hive. Biasanya Hive interpreter dibuat untuk mempermudah penggunaan pada notebook dalam menggunakan kode SQL untuk mengakses data pada Apache Hive.
Langkah ini merupakan kelanjutan dari langkah user impersonation sebelumnya, dan diasumsikan bahwa Hive interpreter telah terkonfigurasi dengan baik.
Login ke Apache Ambari, kemudian pilih Services > HDFS > Configs > Advanced > Custom Core Site. Tambahkan konfigurasi berikut pada Custom Core Site
- hadoop.proxyuser.zeppelin.groups = *
- hadoop.proxyuser.zeppelin.hosts = *
Restart semua service yang terpengaruh oleh perubahan konfigurasi tersebut sesuai yang disarankan oleh Ambari.
Lakukan perubahan pada hive interpreter untuk konfigurasi berikut
- Binding option = per user / isolated
- User impersonate = true
- default.proxy.user.property = hive.server2.proxy.user
- zeppelin.jdbc.auth.type = SIMPLE
- default.user = hive
Simpan dan restart hive interpreter.
Masuk kembali ke Apache Zeppelin notebook dengan menggunakan user01, dan jalankan perintah berikut pada notebook untuk mengetahui user account yang terkoneksi ke Hive.

User Impersonation Untuk Spark Interpreter
Jika telah melakukan langkah-langkah User Impersonation untuk Shell dan Hive, maka untuk user impersonation pada spark interpreter, pastikan konfigurasi spark interpreter terkonfigurasi seperti dibawah ini
- Binding option = per user / isolated
- User impersonate = true
Jalankan perintah berikut dengan menggunakan untuk menguji bahwa user impersonation untuk spark interpreter telah bekerja dengan baik
%spark2.pyspark
print("Spark version : " + spark.version)
Buka resource manager, urlnya bisa dilihat pada Ambari > Services > Yarn > Quick Links > ResourceManager UI

Terlihat pada Resource Manager, user account yang digunakan pada Zeppelin adalah user01
Penutup
Demikian tutorial mengenai konfigurasi user impersonation Apache Zeppelin untuk Shell, Hive dan Spark interpreter. Walaupun Apache Zeppelin yang digunakan adalah versi dari Yava247 Data Management Platform, akan tetapi langkah-langkah yang telah dijelaskan diatas dapat diimplementasikan pada Apache Zeppelin secara umum.