Elasticsearch 7.1 verzióval kapcsolatos a leírásom, melyben megpróbálom bemutatni egy ingyenesen használható, alapszintű hozzáférési rendszer beállítását.
Az elasticsearch alapból nem ad hitelesítéssel és jogosultsággal kapcsolatos funkciókat. Ezeket az X-Pack nevű modul biztosítja, amelynek használata első olvasatra fizetős.
Második olvasatra viszont észre vehetjük, hogy ha nem igényeljük az X-Pack teljes fegyvertárát, akkor a Basic verzióként (ami még szintén ingyenes) használhatunk alapfokú hitelesítési és jogosultságkezelő funkciókat. Jól látható, hogy az RBAC (Role-based access control), illetve a file és native realm típusú hitelesítés érhető el számunkra:

Első lépések
A telepítésről itt tudsz bővebben olvasni: Elasticsearch telepítése Arch Linuxon. Miután telepítetted a megfelelő verziót és megejtetted az első beállítások (cluster, node, network), először érdemes beállítani a beépített felhasználók jelszavát. Jelen állapotban ugyanis szabad a vásár, az csatlakozik az adatbázishoz aki akar. A jelszavak beállítása után ezt már nem lehet megtenni. A beépített felhasználók listája:
- apm_system
- kibana
- logstash_system
- beats_system
- remote_monitoring_user
- elastic
A jelszavak beállítását egy parancssoros programmal tudjuk megtenni:
#elasticsearch-setup-password auto
Használható az interactive opció is az auto helyett, de túl sok jelszót kell bepötyögni, érdemes az auto-t használnod. A felhasználókat és a generált jelszavakat kiírja a konzolra, ezeket érdemes elmenteni. Ezek után ha csatlakozni akarsz a REST API-hoz, az elastic felhasználót és annak jelszavát kell használnod (amíg nincsenek más felhasználóid).
Konfiguráció
Ahogy korábban is beszéltük, a sokfajta hitelesítési megoldás közül a file és a native realm áll ingyenesen a rendelkezésünkre. Mindegy, hogy melyiket választod, azt előtte engedélyezned kell.
xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack: security: authc: realms: file: file1: order: 1 enabled: false native: native1: order: 0
Először is engedélyezned kell az X-Pack security-t. Ez a beállítás megköveteli a transport csatorna SSL beállítását, tehát ezt is beállítjuk. Ezután beállíthatod a file vagy native realm-t. Akár mindkettőt is használhatod egyszerre, lényeg, hogy az order tulajdonságuk is beállításra kerüljön, amivel a hitelesítési sorrendet határozzuk meg. Jelen példában sorrendben első a native, majd a file, bár a fenti példában a file realm kikapcsolásra került (enabled: false).
Native realm
A dokumentácó szerint a legkönnyebb hitelesítési lehetőséget a native realm adja (persze annak, akinek a REST API használata nem gond). A native realm által kezelt felhasználói adatok a clusterre egészére vonatkoznak, így nem konfigurációs fájl, hanem REST API segítségével lehet menedzselni a felhasználókat, jogosultságokat és jelszavakat. Ezeket az adatokat a _security index alatt tárolja a rendszer, ami természetesen a cluster összes node-ján megtalálható lesz.
Mivel korábban már beállítottuk a beépített felhasználók jelszavát, a REST API használatához loginolni kell. Az elastic nevű felhasználó megfelelő lesz hozzá.
curl -u elastic -X POST "127.0.0.1:9200/_security/user/username" -H 'Content-Type: application/json' -d' { "password" : "password", "roles" : [ "superadmin"], "full_name" : "User Name", "email" : "username@example.com", "metadata" : { "intelligence" : 7 } } '
A parancs futtatásakor a curl bekéri az elastic user jelszavát, de ha megadható előre a -u elastic@password formátummal is. Ha minden rendben, az alábbi választ kapod vissza:
{ "created": true }
Ezek után tudod lekérdezni a felhasználó adatait:
curl -u username -X GET "127.0.0.1:9200/_security/_authenticate"
És a válasz:
{ "username": "username", "roles": [ "superadmin" ], "full_name": "User Name", "email": "username@example.com", "metadata": { "intelligence": 7 }, "enabled": true, "authentication_realm": { "name": "native1", "type": "native" }, "lookup_realm": { "name": "native1", "type": "native" } }
File realm
A file realm segítségével a felhasználókat és jogait konfigurációs fájlból olvassa ki az adatbázis. Mivel ez a módszer fájl alapon működik, a konfigurációs fájlokat a cluster mindegyik node-jára át kell másolni. A használható fájlok:
- role_mapping.yml
- roles.yml
- users
- users_roles
A role_mapping.yml fájlt most nem érintjük. A roles.yml tárolja az általunk létrehozott egyedi role szabályokat, az users tárolja a felhasználókat és azok hash jelszavait, az users_roles pedig a felhasználók és role-ok kapcsolásait. Egy felhasználóhoz akár több role is társítható, ezek soronként kerülnek be az users_role fájlba.
Nem kell a fájlokat magunknak szerkesztenünk, kapunk hozzá parancssoros programot: elasticsearch-users. Használata faék egyszerű:
#felhasznalok listazasa elasticsearch-users list #felhasznalo letrehozasa elasticsearch-users useradd username #role beallitasa elasticsearch-users roles username -a superadmin #role torlese elasticsearch-users roles username -r superadmin #felhasznalo torlese elasticsearch-users userdel username #jelszo csere elasticsearch-users passwd username
Role rendszer – RBAC
A szerver mindegyik felhasználóhoz társít egy alapértelmezett role-t. Ez a role engedélyezi a felhasználóknak az authentication végpont elérését, jelszavuk cseréjét és információ kérését saját magukról.
Ezen felül van pár beépített role a rendszerben, amelyek közül majdnem bármelyiket hozzáköthetjük bármelyik felhasználóhoz. Ezek a role-ok rögzített jogosultságokkal rendelkeznek és nem módosíthatóak. Van olyan role, amit nem lehet felhasználóhoz társítani.
- apm_system
Biztosítja az APM rendszer felhasználójának szükséges hozzáférést ahhoz, hogy rendszer szintű adatokat (például monitoring) küldjön az Elasticsearch-nek. - apm_user
Biztosítja az APM-felhasználók számára szükséges jogosultságokat (például az apm-* és .ml-anomalies* indexek olvasási és view_index_metadata jogosultságait). - beats_admin
Hozzáférést biztosít a .management-beats indexhez, amely a Beats konfigurációs adatait tartalmazza. - beats_system
A Beats rendszer felhasználójának hozzáférést biztosít a rendszer szintű adatok (például megfigyelés) elküldéséhez az Elasticsearch-nek. - ingest_admin
Hozzáférést biztosít az összes index sablon és az összes ingest pipeline konfiguráció kezeléséhez. - kibana_dashboard_only_user
Hozzáférést biztosít a Kibana Dashboardhoz, és csak olvasási engedélyeket biztosít a Kibana számára. Ez a role nem fér hozzá a Kibana szerkesztési eszközeihez. - kibana_system
A Kibana rendszer felhasználójának szükséges hozzáférést biztosít a Kibana indexek olvasásához és írásához, index sablonok és tokenek kezeléséhez, valamint az Elasticsearch fürt elérhetőségének ellenőrzéséhez. Ez a szerep biztosítja a read hozzáférést a .monitoring-* indexekhez, valamint az olvasási és írási hozzáférést a .reporting-* indexekhez. - kibana_user
Kibana minden funkciójának elérése. - logstash_admin
Hozzáférést biztosít a .logstash* indexekhez a konfigurációk kezeléséhez. - logstash_system
Biztosítja a Logstash rendszer felhasználójának szükséges hozzáférést ahhoz, hogy rendszer szintű adatokat (például monitoring) küldjön az Elasticsearch-nek. - machine_learning_admin
Biztosítja amanage_ml
cluster jogosultságokat, ezenkívül olvasási elérést az .ml-anomalies
*, .ml-notifications
*, .ml-state *, .ml-meta* indexekhez és írási jogosultságot az .ml-annotations
* indexekhez. - machine_learning_user
Biztosítja a gépi tanulás konfigurációjának, állapotának és eredményeinek megtekintéséhez szükséges minimális jogosultságokat. Ez a szerepkör biztosítja amonitor_ml
cluster jogosultságait, olvasási hozzáférést az .ml-notifications
és a .ml-anomalies* indexekhez (amelyek a gépi tanulási eredményeket tárolják), és írási hozzáférést az .ml-annotations* indexekhez. - monitoring_user
Biztosítja az X-Pack monitoring használatához szükséges minimális jogosultságokat, kivéve a Kibana használatához szükséges jogosultságokat. Ez a szerepkör lehetővé teszi a monitoring indexekhez való hozzáférést és az alapvető cluster információk olvasásához szükséges jogosultságokat. A monitoring_users felhasználókhoz a kibana_user role-t is hozzá kell rendelni. - remote_monitoring_agent
Biztosítja a minimális jogosultságokat az adatok monitoring indexekbe történő írásához (.monitoring-*). Ez a szerepkör a Metricbeat indexek (metricbeat- *) létrehozásához és a hozzájuk tartozó adatok írásához szükséges jogosultságokkal is rendelkezik. - remote_monitoring_collector
Biztosítja azokat a minimális jogosultságokat, amelyek az Elastic Stack monitoring adatainak gyűjtéséhez szükségesek. - reporting_user
Biztosítja az X-Pack felhasználóknak a riport jogosultságot, kivéve a Kibana használatához szükséges más jogosultságokat. Ez a szerepkör hozzáférést biztosít a report indexekhez; de mindegyik felhasználó csak saját jelentéseihez férhet hozzá. A riport felhasználókhoz hozzá kell rendelni a kibana_user szerepkört és egy olyan szerepkört, amely hozzáférést biztosít számukra a jelentések létrehozásához használt adatokhoz. - snapshot_user
Biztosítja a szükséges jogosultságokat az összes index pillanatfelvételének létrehozásához és a meta adatok megtekintéséhez. Ez a szerepkör lehetővé teszi a felhasználók számára, hogy megtekinthessék a meglévő pillanatfelvétel-tárolók és pillanatfelvételek részleteit. Nem engedélyezi a tárolók eltávolítását vagy hozzáadását, illetve a pillanatképek visszaállítását. Nem teszi lehetővé az index beállítások módosítását vagy az index adatok olvasását vagy frissítését. - superuser
Teljes hozzáférést biztosít a cluster-hez, beleértve az összes indexet és adatot. A felhasználók, akiknek a superadmin szerepe van, a felhasználókat és szerepköröket is kezelheti, és bármilyen más felhasználót is megszemélyesíthet a rendszerben. - transport_client
Biztosítja a Java Transport Client által a cluster eléréséhez szükséges jogosultságokat. A Java Transport Client a cluster csomópontjairól információkat gyűjt a Node Liveness API és a Cluster State API használatával. - watcher_admin
Olvasási hozzáférést biztosít a .watches indexhez, olvasási hozzáférést a watch history-hoz a triggered watch indexekhez és lehetővé teszi az összes watch action végrehajtását. - watcher_user
Biztosítja az olvasási hozzáférést a .watches indexhez, és szintén biztosítja a get watch action és a watcher statisztikát.
Az összes beépített role közül a superadmin a legérdekesebb. Ez a role teljes hozzáférést biztosít mindenhez, így csínján kell vele bánni.
Egyedi role
Saját role-ok is létrehozhatóak. Egy role-ban pár tulajdonságot szabályozni kell:
applications
Lista, amely az alkalmazások jogosultsági listáját tartalmazza. A lista elem tartalmazza:application
,privileges
,resources
. Nem kötelező mező.cluster
A cluster jogosultságok listája. Ezek a jogosultságok határozzák meg azokat a cluster-szintű műveleteket, amelyeket az ilyen szerepkörrel rendelkező felhasználók képesek végrehajtani. Nem kötelező mező.global
A globális jogosultságokat meghatározó objektum. A globális jogosultság a cluster jogosultságának formája, amely kérés-érzékeny. A szabványos cluster jogosultság kizárólag a végrehajtott cselekvésen alapuló engedélyezési döntéseket hoz. A globális jogosultság figyelembe veszi a kérelemben szereplő paramétereket is. A globális jogosultságok támogatása jelenleg az alkalmazásjogosultságok kezelésére korlátozódik. Ez a mező nem kötelező.- indices
Az indexek hozzáférési listája. A lista elem tartalmazza:field_security
,names
,privileges
,query
. Nem kötelező mező. metadata
Objektum, amely opcionális metaadatokat tartalmazhat. A metaadat objektumon belül az _ használatával kezdődő kulcsok a rendszerhasználat számára vannak fenntartva.- run_as
Azoknak a felhasználóknak a listája, akik az ezt tulajdonoló felhasználókat megszemélyesíthetik.
role
{ "run_as": [ ... ], "cluster": [ ... ], "global": { ... }, "indices": [ ... ], "applications": [ ... ] }
indices
{ "names": [ … ], "privileges": [ … ], "field_security" : { … }, "query": "…" }
- names
Az indexek (vagy indexnevek) listája, amelyekre az ebben a bejegyzésben szereplő jogosultságok érvényesek. - privileges
Indexszintű jogosultság a kapcsolódó indexeken (azok az indexek, amelyek a name mezőben vannak megadva) - field_security
A dokumentum mezők leírása amelyhez a felhasználók olvasási hozzáféréssel rendelkeznek - query
Egy olyan keresési lekérdezés, amely meghatározza az elérhető dokumentumok olvasási jogát. A társított indexeken belüli dokumentumnak meg kell egyeznie ezzel a lekérdezéssel annak érdekében, hogy a szereplők számára hozzáférhető legyen.
global
{ "application": { "manage": { "applications": [ ... ] } } }
- manage
Az egyetlen támogatott globális jogosultság az alkalmazások jogosultságainak kezeléséhez - applications
A kezelendő alkalmazások neveinek listája. Ez a lista támogatja a helyettesítő karaktereket (pl. “myapp-*”) és a reguláris kifejezéseket (pl. “/ app[0-9]*/”)
application
{ "application": "my_app", "privileges": [ ... ], "resources": [ ... ] }
- application
Alkalmazás neve. - privileges
Az alkalmazáshoz tartozó jogosultságok neveinek listája. - resources
Azok az erőforrások, amelyekre e kiváltságok érvényesek. Ezeket ugyanúgy kezelik, mint az indexnév minta az indices jogosultságban. Ezeknek az erőforrásoknak nincs különösebb jelentősége az Elasticsearch biztonsági jellemzőihez.
Egy teljes példa
{ "cluster": ["all"], "indices": [ { "names": [ "index1", "index2" ], "privileges": ["all"], "field_security" : { // optional "grant" : [ "title", "body" ] }, "query": "{\"match\": {\"title\": \"foo\"}}" // optional } ], "applications": [ { "application": "myapp", "privileges": [ "admin", "read" ], "resources": [ "*" ] } ], "run_as": [ "other_user" ], // optional "metadata" : { // optional "version" : 1 } }
A role-okat természetesen REST API-n keresztül a legkönnyebb menedzselni, amihez a felhasználónak szüksége van a manage_security
cluster jogosultságra.
Egy role létrehozása:
curl -u username -X POST "127.0.0.1:9200/_security/role/clicks_admin" -H 'Content-Type: application/json' -d' { "run_as": [ "clicks_watcher_1" ], "cluster": [ "monitor" ], "indices": [ { "names": [ "events-*" ], "privileges": [ "read" ], "field_security" : { "grant" : [ "category", "@timestamp", "message" ] }, "query": "{\"match\": {\"category\": \"click\"}}" } ] } '
A válasz:
{ "role": { "created": true } }
A fenti definíció alapján a clicks_admin szerepkörrel rendelkező felhasználó:
- megszemélyesítheti a clicks_watcher_1 felhasználót és kéréseket hajthat végre a nevében
- monitorozhatja az Elasticsearch cluster-t
- olvashatja az összes events- kezdetű indexből származó adatokat
- ezeken az indexeken belül csak a click kategóriájú events olvashatja el
- ezeken a dokumentumon belül csak a category-, @timestamp- és message mezők olvashatók.
Fájl alapú role-ok
A fájl alapú role-ok esetében egy role definicióját a roles.yml fájlban hozzuk létre:
click_admins: run_as: [ 'clicks_watcher_1' ] cluster: [ 'monitor' ] indices: - names: [ 'events-*' ] privileges: [ 'read' ] field_security: grant: ['category', '@timestamp', 'message' ] query: '{"match": {"category": "click"}}'
Az Elasticsearch folyamatosan monitorozza a roles.yml fájlt, és automatikusan alkalmazza a változásokat.
A users_roles fájlban társítjuka felhasználót és a role-t. Egy sorban egy társítás:
superuser:user1 click_admins:user2
Ne felejtsd el, hogy a file realm (azaz a fájl alapú felhasználó és role kezelés) node alapú. Ha több node-ból áll a clustered, akkor a cluster összes node-jára el kell juttatnod a fájlokat, illetve az esetleges változtatásokat.