Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Siapkan perangkat AWS IoT Greengrass V2 inti sebagai non-root
Halaman ini menyajikan empat solusi untuk menjalankan perangkat lunak AWS IoT Greengrass Core sebagai non-root. Tinjau tabel perbandingan untuk memahami fitur dan pengorbanan dari setiap solusi, lalu gunakan diagram alur keputusan untuk mengidentifikasi mana yang sesuai dengan kebutuhan Anda.
catatan
Solusi non-root pada halaman ini hanya berlaku untuk AWS IoT Greengrass nukleus pada perangkat Linux. Windows tidak termasuk karena AWS IoT Greengrass V2 harus dijalankan sebagai layanan sistem pada Windows. Untuk instalasi root standar di Linux, lihatInstal perangkat lunak AWS IoT Greengrass Core dengan penyediaan sumber daya otomatis.
Untuk menjalankan AWS IoT Greengrass nucleus lite sebagai pengguna non-root, lihat Menggunakan Podman di repositori
Topik
Pilih solusi non-root
Gunakan tabel berikut untuk membandingkan solusi non-root dan memahami pengorbanannya. Setiap solusi menawarkan kemampuan yang berbeda tergantung pada persyaratan keamanan dan kendala perangkat Anda.
| Solusi | Membutuhkan akses root | Dapat menjalankan komponen sebagai pengguna yang berbeda | Menjalankan Greengrass sebagai layanan sistem | Terbaik untuk |
|---|---|---|---|---|
Tidak |
Tidak |
Tidak (layanan pengguna opsional) |
Perangkat di mana Anda tidak memiliki akses root |
|
Ya (hanya pengaturan) |
Tidak |
Ya |
Menjalankan Greengrass sebagai pengguna non-root dengan semua komponen berjalan sebagai pengguna yang sama |
|
Ya (hanya pengaturan) |
Ya |
Ya |
Menjalankan Greengrass sebagai pengguna non-root saat menjalankan komponen sebagai pengguna yang berbeda |
|
Ya |
Ya |
Ya |
Menjalankan Greengrass sebagai root dengan seperangkat kemampuan Linux terbatas |
Diagram alur berikut memandu Anda dalam memilih solusi yang sesuai berdasarkan kendala dan persyaratan perangkat Anda.
Solusi 1: Mengatur AWS IoT Greengrass V2 tanpa akses root
Gunakan solusi ini ketika Anda tidak memiliki akses root pada perangkat. Dalam konfigurasi ini, perangkat lunak AWS IoT Greengrass Core berjalan sepenuhnya sebagai pengguna non-root tanpa hak istimewa yang tinggi.
Pengorbanan
Solusi ini memiliki keterbatasan sebagai berikut:
Tidak ada pemisahan pengguna komponen — Semua komponen berjalan sebagai pengguna yang sama yang menjalankan perangkat lunak AWS IoT Greengrass Core. Anda tidak dapat menggunakan
posixUserkonfigurasi untuk menjalankan komponen sebagai pengguna yang berbeda.RequiresPrivilege diabaikan — Perangkat lunak AWS IoT Greengrass Core mengabaikan
RequiresPrivilegeopsi dalam resep komponen. Komponen tidak dapat meminta hak istimewa yang ditinggikan.Tidak ada layanan sistem — Anda tidak dapat menginstal perangkat lunak AWS IoT Greengrass Core sebagai layanan sistem. Anda dapat mengonfigurasi secara opsional AWS IoT Greengrass V2 untuk dijalankan sebagai layanan pengguna systemd.
Prasyarat
Solusi ini membutuhkan:
Akun pengguna non-root di perangkat
Tulis akses ke direktori tempat Anda ingin menginstal perangkat lunak AWS IoT Greengrass Core
Untuk menginstal dan menjalankan AWS IoT Greengrass V2 tanpa akses root
-
Selesaikan langkah-langkah berikut dariInstal perangkat lunak AWS IoT Greengrass Core dengan penyediaan sumber daya otomatis: atur lingkungan perangkat Anda, berikan kredensyal, dan unduh perangkat lunak AWS IoT Greengrass Core.
-
Buat direktori instalasi dan pastikan pengguna Anda memilikinya.
mkdir -p $HOME/greengrass/v2 -
Jalankan installer tanpa
sudo. Setel--component-default-userke pengguna Anda saat ini.java -Droot="$HOME/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user $USER \ --provision trueJangan gunakan
--setup-system-service truekarena Anda tidak memiliki akses root untuk membuat layanan sistem.
(Opsional) Siapkan layanan pengguna systemd
Anda dapat mengonfigurasi layanan pengguna systemd untuk mengelola perangkat lunak AWS IoT Greengrass Core. Ini memungkinkan perangkat lunak untuk memulai secara otomatis ketika Anda masuk.
Untuk menyiapkan layanan pengguna systemd
-
Hentikan perangkat lunak AWS IoT Greengrass Core jika sedang berjalan.
kill $(cat $HOME/greengrass/v2/alts/loader.pid) -
Buat direktori layanan pengguna systemd.
mkdir -p $HOME/.config/systemd/user -
Buat file layanan di
$HOME/.config/systemd/user/greengrass.servicedengan konten berikut.[Unit] Description=Greengrass Core [Service] Type=simple PIDFile=%h/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh %h/greengrass/v2/alts/current/distro/bin/loader Environment="JAVA_HOME=/path/to/java" [Install] WantedBy=default.targetDalam file unit pengguna systemd,
%hadalah specifier yang menyelesaikan ke direktori home pengguna yang menjalankan layanan.Ganti
/path/to/javadengan jalur ke instalasi Java Anda. -
Aktifkan dan mulai layanan.
systemctl --user daemon-reload systemctl --user enable greengrass.service systemctl --user start greengrass.service
Mulai ulang dan perilaku pembaruan OTA
Perilaku tergantung pada apakah Anda mengonfigurasi layanan pengguna systemd.
- Dengan layanan pengguna
-
Reboot perangkat - Perangkat lunak AWS IoT Greengrass Inti dimulai secara otomatis ketika pengguna masuk.
Pembaruan OTA - Pembaruan OTA berhasil dan perangkat lunak dimulai ulang secara otomatis.
- Tanpa layanan pengguna
-
Reboot perangkat — Perangkat lunak AWS IoT Greengrass Core tidak restart secara otomatis. Anda harus memulainya secara manual.
Pembaruan OTA - Pembaruan OTA berhasil, tetapi Anda harus memulai perangkat lunak AWS IoT Greengrass Core secara manual sesudahnya.
Batas sumber daya sistem
Batas sumber daya per komponen menggunakan cgroups tidak berfungsi dalam solusi ini karena pengguna non-root tidak dapat membuat direktori cgroup di. /sys/fs/cgroup/ Jika Anda menerapkan komponen dengan batas sumber daya yang dikonfigurasi, perangkat lunak AWS IoT Greengrass Core mengabaikan batas yang dikonfigurasi.
Anda dapat menggunakan alternatif berikut untuk mengelola penggunaan sumber daya:
-
Batas layanan pengguna Systemd — Jika Anda menjalankan perangkat lunak AWS IoT Greengrass Core sebagai layanan pengguna systemd, Anda dapat menambahkan batas sumber daya ke file layanan di.
$HOME/.config/systemd/user/greengrass.serviceBatasan ini berlaku untuk seluruh layanan, termasuk inti Greengrass dan semua komponen.MemoryMax=2G CPUQuota=100% -
Batas JVM inti Greengrass — Anda dapat membatasi memori proses inti Greengrass dengan mengonfigurasi opsi JVM. Untuk informasi selengkapnya, lihat Konfigurasikan perangkat lunak AWS IoT Greengrass Inti.
Solusi 2: Siapkan AWS IoT Greengrass V2 sebagai non-root tanpa pemisahan pengguna komponen
Gunakan solusi ini ketika Anda memiliki akses root untuk pengaturan awal dan ingin perangkat lunak AWS IoT Greengrass Core berjalan sebagai layanan sistem non-root, tetapi Anda tidak perlu menjalankan komponen sebagai pengguna yang berbeda. Ini mirip dengan Solusi 1, tetapi perangkat lunak berjalan sebagai layanan sistem yang dimulai secara otomatis saat boot.
Pengorbanan
Solusi ini memiliki keterbatasan sebagai berikut:
Tidak ada pemisahan pengguna komponen — Semua komponen berjalan sebagai pengguna yang sama yang menjalankan perangkat lunak AWS IoT Greengrass Core. Anda tidak dapat menggunakan
posixUserkonfigurasi untuk menjalankan komponen sebagai pengguna yang berbeda.RequiresPrivilege diabaikan — Perangkat lunak AWS IoT Greengrass Core mengabaikan
RequiresPrivilegeopsi dalam resep komponen. Komponen tidak dapat meminta hak istimewa yang ditinggikan.
Prasyarat
Solusi ini membutuhkan:
Akses root untuk pengaturan awal
systemd di perangkat Anda
Untuk menginstal dan menjalankan AWS IoT Greengrass V2 sebagai non-root tanpa pemisahan pengguna komponen
-
Selesaikan langkah-langkah berikut dariInstal perangkat lunak AWS IoT Greengrass Core dengan penyediaan sumber daya otomatis: atur lingkungan perangkat Anda, berikan kredensyal, dan unduh perangkat lunak AWS IoT Greengrass Core.
-
Buat pengguna non-root yang akan menjalankan perangkat lunak AWS IoT Greengrass Core dan semua komponen.
sudo useradd --create-home gg_non_root -
Masuk sebagai pengguna non-root dan jalankan penginstal. Setel
--component-default-userke pengguna yang sama. Jangan gunakansudodan jangan mengatur layanan sistem.java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user gg_non_root \ --provision true \ --setup-system-service false -
Sebagai root, buat file layanan sistem di
/etc/systemd/system/greengrass.servicedengan konten berikut.[Unit] Description=Greengrass Core After=network.target [Service] Type=simple User=gg_non_root PIDFile=/home/gg_non_root/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh -c "exec /home/gg_non_root/greengrass/v2/alts/current/distro/bin/loader >> /home/gg_non_root/greengrass/v2/logs/loader.log 2>&1" KillMode=mixed NoNewPrivileges=true ProtectSystem=strict ReadWritePaths=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.target -
Hentikan instance AWS IoT Greengrass Core yang sedang berjalan, lalu aktifkan dan mulai layanan sistem.
sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
Mulai ulang dan perilaku pembaruan OTA
Dalam solusi ini:
Perangkat lunak AWS IoT Greengrass Core berjalan sebagai layanan sistem dan restart secara otomatis pada kegagalan atau reboot perangkat.
Pembaruan OTA untuk perangkat lunak AWS IoT Greengrass Core berfungsi. Layanan restart secara otomatis sebagai pengguna non-root yang dikonfigurasi.
Batas sumber daya sistem
Batas sumber daya per komponen menggunakan cgroups tidak berfungsi dalam solusi ini karena pengguna non-root tanpa kemampuan Linux tidak dapat membuat direktori cgroup di. /sys/fs/cgroup/ Jika Anda menerapkan komponen dengan batas sumber daya yang dikonfigurasi, perangkat lunak AWS IoT Greengrass Core mengabaikan batas yang dikonfigurasi.
Anda dapat menggunakan alternatif berikut untuk mengelola penggunaan sumber daya:
-
Batas layanan Systemd — Anda dapat menambahkan batas sumber daya ke file layanan sistem di
/etc/systemd/system/greengrass.service. Batasan ini berlaku untuk seluruh layanan, termasuk inti Greengrass dan semua komponen.MemoryMax=2G CPUQuota=100% -
Batas JVM inti Greengrass — Anda dapat membatasi memori proses inti Greengrass dengan mengonfigurasi opsi JVM. Untuk informasi selengkapnya, lihat Konfigurasikan perangkat lunak AWS IoT Greengrass Inti.
Solusi 3: Siapkan AWS IoT Greengrass V2 sebagai non-root dengan pemisahan pengguna komponen
Gunakan solusi ini ketika Anda memiliki akses root untuk pengaturan awal tetapi ingin perangkat lunak AWS IoT Greengrass Core berjalan sebagai pengguna non-root sambil mempertahankan kemampuan untuk menjalankan komponen sebagai pengguna yang berbeda. Konfigurasi ini menggunakan kemampuan Linux dan sudoer untuk memungkinkan pengguna non-root beralih ke pengguna lain saat menjalankan komponen.
Pengorbanan
Solusi ini memiliki keterbatasan sebagai berikut:
Memerlukan konfigurasi sudoers - Anda harus mengkonfigurasi sudoers untuk memungkinkan pengguna menjalankan perintah sebagai AWS IoT Greengrass V2 pengguna lain.
Prasyarat
Solusi ini membutuhkan:
Akses root untuk pengaturan awal
systemd versi 229 atau yang lebih baru, yang mendukung.
AmbientCapabilitiesUntuk memeriksa versi Anda, jalankansystemctl --version.
Untuk menginstal dan menjalankan AWS IoT Greengrass V2 sebagai non-root dengan pemisahan pengguna komponen
-
Selesaikan langkah-langkah berikut dariInstal perangkat lunak AWS IoT Greengrass Core dengan penyediaan sumber daya otomatis: atur lingkungan perangkat Anda, berikan kredensyal, dan unduh perangkat lunak AWS IoT Greengrass Core.
-
Buat pengguna non-root yang akan menjalankan perangkat lunak AWS IoT Greengrass Core.
sudo useradd --create-home gg_non_root -
Tambahkan pengguna non-root ke sudoers sehingga dapat menjalankan perintah sebagai pengguna komponen. Buat file di
/etc/sudoers.d/gg_non_root.gg_non_root ALL=(ggc_user:ggc_group) NOPASSWD: SETENV: /bin/sh, /bin/bashJika Anda mengonfigurasi komponen untuk dijalankan sebagai pengguna tambahan
posixUser, tambahkan entri sudoers untuk setiap pengguna. Contoh:gg_non_root ALL=(ggc_user:ggc_group) NOPASSWD: SETENV: /bin/sh, /bin/bash gg_non_root ALL=(another_user:another_group) NOPASSWD: SETENV: /bin/sh, /bin/bash -
Masuk sebagai pengguna non-root dan jalankan penginstal. Jangan gunakan
sudodan jangan mengatur layanan sistem.java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service false -
Sebagai root, buat file layanan sistem di
/etc/systemd/system/greengrass.servicedengan konten berikut.[Unit] Description=Greengrass Core After=network.target [Service] Type=simple User=gg_non_root PIDFile=/home/gg_non_root/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh -c "exec /home/gg_non_root/greengrass/v2/alts/current/distro/bin/loader >> /home/gg_non_root/greengrass/v2/logs/loader.log 2>&1" KillMode=mixed AmbientCapabilities=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE ProtectSystem=strict ReadWritePaths=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.targetUntuk informasi tentang kemampuan yang diperlukan, lihatKemampuan Linux yang dibutuhkan oleh AWS IoT Greengrass V2.
AmbientCapabilitiesmemberikan kemampuan Linux yang ditentukan kepada pengguna non-root yang menjalankan layanan. Hal ini memungkinkan perangkat lunak AWS IoT Greengrass Core untuk melakukan operasi istimewa seperti beralih pengguna saat menjalankan komponen, tanpa berjalan sebagai root.CapabilityBoundingSetmembatasi serangkaian kemampuan maksimum yang dapat digunakan layanan dan proses turunannya. Kemampuan yang tidak ada dalam set ini akan dijatuhkan secara permanen.ProtectSystem=strictmembuat seluruh sistem file read-only untuk layanan, mencegah modifikasi sistem operasi.ReadWritePathsmenentukan satu-satunya direktori yang layanan dapat menulis ke.
-
Hentikan instance AWS IoT Greengrass Core yang sedang berjalan, lalu aktifkan dan mulai layanan sistem.
sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
Mulai ulang dan perilaku pembaruan OTA
Dalam solusi ini:
Perangkat lunak AWS IoT Greengrass Core berjalan sebagai layanan sistem dan restart secara otomatis pada kegagalan atau reboot perangkat.
Pembaruan OTA untuk perangkat lunak AWS IoT Greengrass Core berfungsi. Layanan restart secara otomatis sebagai pengguna non-root yang dikonfigurasi.
Batas sumber daya sistem
Batas sumber daya per komponen untuk memori dan CPU bekerja dalam solusi ini dengan cara yang sama seperti saat menjalankan perangkat lunak AWS IoT Greengrass Core sebagai root.
Solusi 4: Siapkan AWS IoT Greengrass V2 sebagai root dengan kemampuan terbatas
Gunakan solusi ini ketika Anda ingin perangkat lunak AWS IoT Greengrass Core berjalan sebagai root tetapi dengan serangkaian kemampuan Linux yang berkurang. Konfigurasi ini menyediakan fungsionalitas penuh berjalan sebagai root sambil membatasi permukaan serangan dengan membatasi kemampuan yang tersedia untuk perangkat lunak dan komponennya.
Pengorbanan
Solusi ini memiliki pertimbangan sebagai berikut:
Komponen dengan RequiresPrivilege kemampuan terbatas — Komponen yang digunakan
RequiresPrivilegeberjalan dengan serangkaian kemampuan terbatas yang sama dengan perangkat lunak AWS IoT Greengrass Core, bukan hak akses root penuh.
Prasyarat
Solusi ini membutuhkan:
Akses root
systemd di perangkat Anda
Untuk menginstal dan menjalankan AWS IoT Greengrass V2 sebagai root dengan kemampuan terbatas
-
Selesaikan langkah-langkah berikut dariInstal perangkat lunak AWS IoT Greengrass Core dengan penyediaan sumber daya otomatis: atur lingkungan perangkat Anda, berikan kredensyal, dan unduh perangkat lunak AWS IoT Greengrass Core.
-
Ubah file template layanan di
GreengrassInstaller/bin/greengrass.service.template, di direktori tempat Anda mengunduh perangkat lunak AWS IoT Greengrass Core. Tambahkan baris berikut ke[Service]bagian sebelum Anda menjalankan penginstal:CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE ProtectSystem=strict ReadWritePaths=/greengrass /tmpCapabilityBoundingSetadalah fitur keamanan systemd yang membatasi kemampuan Linux yang tersedia untuk perangkat lunak AWS IoT Greengrass Core dan semua proses anaknya. Dengan mengonfigurasi set pembatas, Anda membatasi apa yang dapat dilakukan oleh proses inti Greengrass dan komponen, bahkan saat dijalankan sebagai root. Untuk informasi tentang setiap kemampuan, lihatKemampuan Linux yang dibutuhkan oleh AWS IoT Greengrass V2.ProtectSystem=strictmembuat seluruh sistem file read-only untuk layanan, mencegah modifikasi sistem operasi. Ini menyediakan sandboxing systemd yang melindungi file sistem bahkan jika komponen berbahaya berjalan dengan hak istimewa yang tinggi.ReadWritePathsmenentukan satu-satunya direktori yang layanan dapat menulis ke. Bersama denganProtectSystem=strict, ini membatasi layanan untuk menulis hanya ke direktori AWS IoT Greengrass V2 root dan/tmp.
-
Jalankan installer dengan
--setup-system-service true.sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service true
Mulai ulang dan perilaku pembaruan OTA
Dalam solusi ini:
Perangkat lunak AWS IoT Greengrass Core berjalan sebagai layanan sistem dan restart secara otomatis pada kegagalan atau reboot perangkat.
Pembaruan OTA untuk perangkat lunak AWS IoT Greengrass Core berfungsi. Pembaruan perangkat lunak dan restart secara otomatis.
Batas sumber daya sistem
Batas sumber daya per komponen untuk memori dan CPU bekerja dalam solusi ini dengan cara yang sama seperti saat menjalankan perangkat lunak AWS IoT Greengrass Core sebagai root.
Kemampuan Linux yang dibutuhkan oleh AWS IoT Greengrass V2
Tabel berikut menjelaskan kemampuan Linux yang dibutuhkan oleh perangkat lunak AWS IoT Greengrass Core saat berjalan dalam konfigurasi non-root. Kemampuan ini digunakan dalam Solusi 3 dan 4.
| Kemampuan | Deskripsi | Diperlukan untuk |
|---|---|---|
|
Buat perubahan sewenang-wenang pada file UIDs dan GIDs |
Mengubah kepemilikan file tergantung pada pengguna yang mengeksekusi komponen |
|
Bypass file membaca, menulis, dan menjalankan pemeriksaan izin |
Mengizinkan pengguna inti Greengrass untuk mengeksekusi file saat digunakan untuk skrip dengan |
|
Bypass pemeriksaan izin baca file dan direktori baca dan jalankan pemeriksaan izin |
Berjalan di hierarki folder bahkan untuk folder, pengguna inti Greengrass tidak memiliki izin untuk membaca |
|
Bypass pemeriksaan izin pada operasi yang biasanya memerlukan UID sistem file dari proses untuk mencocokkan UID file |
Melewati pemeriksaan kepemilikan file |
|
Buat manipulasi proses yang sewenang-wenang UIDs |
Menggunakan |
|
Buat manipulasi proses yang sewenang-wenang GIDs |
Menggunakan |
|
Ganti batas sumber daya |
Menetapkan batas sumber daya pada proses komponen, meskipun batas tidak ditentukan dalam penerapan |
|
Menulis catatan ke log audit kernel |
Memungkinkan |