{"id":22867,"date":"2025-10-12T18:17:06","date_gmt":"2025-10-12T16:17:06","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22867"},"modified":"2025-10-13T08:58:01","modified_gmt":"2025-10-13T06:58:01","slug":"hashicorp-vault-auf-raspberry-pi-mit-kali-per-java-zugreiffen-wie-teil-1","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22867","title":{"rendered":"HashiCorp Vault auf Raspberry PI mit Kali per Java zugreifen &#8211; Wie? (Teil 1)"},"content":{"rendered":"<p>Auf dem Raspberry Pi Zero 2 W wollte ich mal einen <a href=\"http:\/\/kleinhirn.eu\/2025\/10\/03\/hashi-corp-vault\/\" target=\"_blank\">HashiCorp Vault<\/a> installieren. Ich habe dazu ein Kali 32-Bit System verwendet, aber es l\u00e4uft auch analog auf anderen Systemen.<\/p>\n<p>Ziel ist es per Java und AppRole Workflow auf den Vault mit diesem Workflow zuzugreifen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-scaled.jpeg\" alt=\"\" width=\"2560\" height=\"1605\" class=\"aligncenter size-full wp-image-22868\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-scaled.jpeg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-300x188.jpeg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-1024x642.jpeg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-768x481.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-1536x963.jpeg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/vault-2048x1284.jpeg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Hier die Schritte im \u00dcberblick die gezeigt werden:<\/p>\n<p>Teil 1:<br \/>\n&#8211;<a href=\"http:\/\/kleinhirn.eu\/2025\/10\/03\/hashi-corp-vault\/\" target=\"_blank\">HashiCorp Vault<\/a> laden und installieren<br \/>\n-User einrichten<br \/>\n-Vault in vault.hcl einrichten<br \/>\n-Quicktest<br \/>\n-Zertifikate f\u00fcr https erg\u00e4nzen<br \/>\n-Systemservice erstellen<br \/>\n-Zugriff auf Vault CLI Api<br \/>\n-einen non root token einrichten<br \/>\n-Cubbyhole Secrets Engine lesen und schreiben<\/p>\n<p>Teil 2:<br \/>\n-Vault Rollen und Rechte einrichten<br \/>\n-Java Zugriff mit Demo App<\/p>\n<p><!--more--><\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\n# System updaten\r\nsudo apt update &amp;&amp; sudo apt upgrade -y\r\n\r\n# Passende 32-Bit Version f\u00fcr Kali-Linux Arm holen\r\ncurl -LO https:\/\/releases.hashicorp.com\/vault\/1.20.4\/vault_1.20.4_linux_arm.zip\r\n# Archive auspacken \r\nsudo unzip -o vault_1.20.4_linux_arm.zip -d \/usr\/local\/bin\/\r\n# Versions Check\r\nvault version\r\n# ok, l\u00e4uft: Vault v1.20.4 (55bd8f18c6c84aa89fdede4850a622c57f03bd7e), built 2025-09-23T13:22:38Z\r\n\r\n# Verzeichnis &amp; Nutzer anlegen\r\nsudo useradd --system --home \/etc\/vault.d --shell \/usr\/sbin\/nologin vault\r\nsudo mkdir -p \/etc\/vault.d \/opt\/vault\/data\r\nsudo chown -R vault:vault \/etc\/vault.d \/opt\/vault\r\n\r\n# Konfigurations Date, anlegen (erst mal per http f\u00fcr Quicktest, oder gleich zu https springen) , IP Adresse anpassen:\r\n\r\nsudo vi  \/etc\/vault.d\/vault.hcl\r\n\r\n# Inhalt:\r\n\r\nstorage \"file\" {\r\n  path = \"\/opt\/vault\/data\"\r\n}\r\n\r\nlistener \"tcp\" {\r\n  address     = \"7.7.7.93:8200\"\r\n  tls_disable = \"true\"   # nur lokal; f\u00fcr Remote TLS konfigurieren\r\n}\r\n\r\ndisable_mlock = true\r\nui  = true\r\napi_addr     = \"http:\/\/7.7.7.93:8200\"\r\ncluster_addr = \"http:\/\/7.7.7.93:8201\"\r\n\r\n\r\n# Test starte vault mit Konfig Datei:\r\n\r\nsudo \/usr\/local\/bin\/vault server -config=\/etc\/vault.d\/vault.hcl\r\n\r\n\r\n# es l\u00e4uft:\r\n\u250c\u2500\u2500(thomaswenzlaff\u327fpi-kali)-[~]\r\n\u2514\u2500$ sudo \/usr\/local\/bin\/vault server -config=\/etc\/vault.d\/vault.hcl\r\n==&gt; Vault server configuration:\r\n\r\nAdministrative Namespace:\r\n             Api Address: http:\/\/7.7.7.93:8200\r\n                     Cgo: disabled\r\n         Cluster Address: https:\/\/7.7.7.93:8201\r\n   Environment Variables: HOME, LANG, LC_ALL, LC_TERMINAL, LC_TERMINAL_VERSION, LOGNAME, LS_COLORS, MAIL, PATH, SHELL, SUDO_COMMAND, SUDO_GID, SUDO_HOME, SUDO_TTY, SUDO_UID, SUDO_USER, TERM, USER\r\n              Go Version: go1.24.6\r\n              Listener 1: tcp (addr: \"7.7.7.93:8200\", cluster address: \"7.7.7.93:8201\", disable_request_limiter: \"false\", max_json_array_element_count: \"10000\", max_json_depth: \"300\", max_json_object_entry_count: \"10000\", max_json_string_value_length: \"1048576\", max_request_duration: \"1m30s\", max_request_size: \"33554432\", tls: \"disabled\")\r\n               Log Level:\r\n                   Mlock: supported: true, enabled: false\r\n           Recovery Mode: false\r\n                 Storage: file\r\n                 Version: Vault v1.20.4, built 2025-09-23T13:22:38Z\r\n             Version Sha: 55bd8f18c6c84aa89fdede4850a622c57f03bd7e\r\n\r\n==&gt; Vault server started! Log data will stream in below:\r\n\r\n# Eingabe 1 und 1, keys Downloaden:\r\n\r\n{\r\n  \"keys\": [\r\n    \"96801cfac8d8fb050e2286c153f659999bd195ce21263b07cc19cbda1e16c8b1\"\r\n  ],\r\n  \"keys_base64\": [\r\n    \"loAc+sjY+wUOIobBU\/ZZmZvRlc4hJjsHzBnL2h4WyLE=\"\r\n  ],\r\n  \"root_token\": \"hvs.BCEBFAg5qMrAkbMfc00cKsvi\"\r\n}\r\n\r\n# So jetzt soll es mit https und Zertifikate laufen\r\n\r\n# Zertifikat mit XCA erstellen wie hier schon beschrieben ( http:\/\/blog.wenzlaff.de\/?s=XCA ) und nach kopieren:\r\n\/usr\/local\/share\/ca-certificates \r\n\r\n# update\r\nupdate-ca-certificates \r\n\r\n# In config https erg\u00e4nzen:\r\n\r\nsudo vi  \/etc\/vault.d\/vault.hcl\r\n\r\ncat  \/etc\/vault.d\/vault.hcl\r\nstorage \"file\" {\r\n  path = \"\/opt\/vault\/data\"\r\n}\r\n\r\n# HTTPS listener\r\nlistener \"tcp\" {\r\n  address       = \"7.7.7.93:8200\"\r\n  # Public Zertifikat: Wird verteilt und von Clients zur Validierung des Vault-Servers genutzt.\r\n  tls_cert_file = \"\/usr\/local\/share\/ca-certificates\/wenzlaff_pi-kali_vault.crt\"\r\n\r\n  # Private Key: Bleibt am Server, niemals \u00f6ffentlich, dient zur Verschl\u00fcsselung und als Authentifizierungsnachweis f\u00fcr TLS.\r\n  tls_key_file  = \"\/usr\/local\/share\/ca-certificates\/wenzlaff_pi-kali_vault.pem\"\r\n}\r\n\r\ndisable_mlock = true\r\nui           = true\r\napi_addr     = \"https:\/\/7.7.7.93:8200\"\r\ncluster_addr = \"https:\/\/7.7.7.93:8201\"\r\n\r\nsudo \/usr\/local\/bin\/vault server -config=\/etc\/vault.d\/vault.hcl\r\n\r\n\r\n# noch ein Systemservice anlegen sudo vi \/etc\/systemd\/system\/vault.service\r\n\r\n[Unit]\r\nDescription=HashiCorp Vault\r\nConditionFileNotEmpty=\/etc\/vault.d\/vault.hcl\r\n\r\n[Service]\r\nUser=vault\r\nGroup=vault\r\nAmbientCapabilities=CAP_IPC_LOCK\r\nCapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK\r\nExecStart=\/usr\/local\/bin\/vault server -config=\/etc\/vault.d\/vault.hcl\r\nExecReload=\/bin\/kill --signal HUP $MAINPID\r\nKillMode=process\r\nKillSignal=SIGINT\r\nRestart=on-failure\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\n\r\n\r\n# Aktivieren &amp; starten\r\nsudo systemctl daemon-reload\r\nsudo systemctl enable --now vault\r\nsystemctl status vault --no-pager<\/pre>\n<p>So jetzt l\u00e4uft der Vault, und wir k\u00f6nnen \u00fcber die GUI per <strong>https<\/strong> zugreifen mit (IP anpassen): <strong>https:\/\/7.7.7.93:8200<\/strong><\/p>\n<p>Nun wollen wir von der Kommandozeile aus auf die Vault CLI zugreifen. Dazu m\u00fcssen wir einmalig die Adresse setzen, z.B.<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\nexport VAULT_ADDR=https:\/\/7.7.7.93:8200\r\n\r\n# Dann habe wir Zugriff z.B. mit\r\n\r\nvault status\r\n\r\n# Wir bekommen dann z.B.\r\n\r\nKey             Value\r\n---             -----\r\nSeal Type       shamir\r\nInitialized     true\r\nSealed          false\r\nTotal Shares    1\r\nThreshold       1\r\nVersion         1.20.4\r\nBuild Date      2025-09-23T13:22:38Z\r\nStorage Type    file\r\nCluster Name    vault-cluster-ca72947d\r\nCluster ID      2e39f08c-716e-8d82-d18b-a3acb23618fc\r\nHA Enabled      false\r\n\r\n# Nun setzen wir erst mal den root Token\r\n\r\nexport VAULT_TOKEN=hvs.BCEBFAg5qMrAkbMfc00cKsvi\r\n\r\n# nun einen eigenen Token, der nicht root ist erzeugen\u2028\r\n\r\nvault token create -policy=default\r\n\r\n#Antwort:\r\n# Key                  Value\r\n# ---                  -----\r\n# token                hvs.CAESIJ5s1dbhSt2EMS-8ripWn7FRsOxPWTuvnhM5hp11-1I9Gh4KHGh2cy5tQnh6elYzMWptM0F4cHFZZ3JzZGE4NHk\r\n# token_accessor       rcH3rGrPwO64yWpQ6YY5Slby\r\n# token_duration       768h\r\n# token_renewable      true\r\n# token_policies       [\"default\"]\r\n# identity_policies    []\r\n# policies             [\"default\"]\r\n\r\n# diese privaten Token wollen wir nun verwenden\r\n# dazu den root-Token durch den eben erzeugten token ersetzen:\r\n\r\nexport VAULT_TOKEN=hvs.CAESIJ5s1dbhSt2EMS-8ripWn7FRsOxPWTuvnhM5hp11-1I9Gh4KHGh2cy5tQnh6elYzMWptM0F4cHFZZ3JzZGE4NHk\r\n\r\n# Nun machen wir den ersten Eintrag in das cubbyhole (Ablagefach), das immer vorhanden ist und nur mit dem jeweiligen Token zu lesen ist:\r\n\r\nvault kv put -mount=cubbyhole mindmap derKey=derValue:kleinhirn.eu\r\n\r\n# Ergebnis: Success! Data written to: cubbyhole\/mindmap\r\n\r\n# wenn man sich an die GUI mit dem Token anmeldet, findet man den Eintrag, solage der Token g\u00fcltig ist\r\n\r\n# oder \u00fcber die CLI kann man ihn wieder lesen:\r\n\r\nvault read cubbyhole\/mindmap\r\n\r\n# Ergebnis:\r\n# Key       Value\r\n# ---       -----\r\n# derKey    derValue:kleinhirn.eu\r\n\r\n# oder\r\n\r\nvault kv get -mount=cubbyhole mindmap\r\n\r\n# oder ohne SSL-Zertifikatspr\u00fcfung in Testumgebung mit curl\r\n\r\ncurl --insecure -H \"X-Vault-Token: hvs.CAESIJ5s1dbhSt2EMS-8ripWn7FRsOxPWTuvnhM5hp11-1I9Gh4KHGh2cy5tQnh6elYzMWptM0F4cHFZZ3JzZGE4NHk\" https:\/\/10.0.7.93:8200\/v1\/cubbyhole\/mindmap\r\n\r\n# Ergebnis\r\n# {\"request_id\":\"3e898521-0dcb-77b4-2fc0-36538e21664a\",\"lease_id\":\"\",\"renewable\":false,\"lease_duration\":0,\"data\": {\"derKey\":\"derValue:kleinhirn.eu\"},\"wrap_info\":null,\"warnings\":null,\"auth\":null,\"mount_type\":\"cubbyhole\"}\r\n\r\n<\/pre>\n<p>So sieht der Cubbyhole-Token in der Gui aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10.jpeg\" alt=\"\" width=\"2308\" height=\"858\" class=\"aligncenter size-full wp-image-22883\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10.jpeg 2308w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10-300x112.jpeg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10-1024x381.jpeg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10-768x286.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10-1536x571.jpeg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-12-um-17.52.10-2048x761.jpeg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Cubbyhole ist \u00fcbrigens eine spezielle Secrets Engine in HashiCorp Vault, die fl\u00fcchtigen, privaten Speicher pro Token bereitstellt. Jeder Token erh\u00e4lt seinen eigenen, komplett isolierten und nur f\u00fcr diesen Token zug\u00e4nglichen Speicherplatz \u2013 vergleichbar mit eigenen kleinen F\u00e4chern (Cubbies) in einem Kindergarten.<\/p>\n<p><strong>Eigenschaften von Cubbyhole<\/strong><\/p>\n<p>&#8211; Isolation: Kein anderer Token (auch nicht der Root-Token) kann auf die Daten eines anderen Cubbyhole zugreifen.<\/p>\n<p>&#8211; Lebensdauer: Sobald ein Token verf\u00e4llt oder widerrufen wird, wird dessen Cubbyhole und alle darin gespeicherten Daten gel\u00f6scht.<\/p>\n<p>&#8211; Keine Versionierung: Anders als die KV-Engine gibt es keine Versionen oder TTLs f\u00fcr die gespeicherten Daten; Cubbyhole existiert nur solange wie das Token.<\/p>\n<p>&#8211; Standardm\u00e4\u00dfig aktiv: Die Cubbyhole-Engine ist von Beginn an aktiv und kann weder entfernt, verschoben noch mehrfach aktiviert werden.<\/p>\n<p><strong>Hauptanwendungsf\u00e4lle<\/strong><\/p>\n<p>&#8211; One-Time-Secrets: Sicheres \u00dcbermitteln von einmaligen Secrets, z. B. Initialisierungstoken an Applikationen.<\/p>\n<p>&#8211; Response Wrapping: Tempor\u00e4re Speicherung geheimer Daten \u00fcber einen sogenannten Wrapping-Token, der die Daten an Empf\u00e4nger weitergibt, ohne die Werte selbst preiszugeben.<\/p>\n<p>Cubbyhole ist also ein tempor\u00e4rer, token-gebundener Speicher, der garantiert, dass sensible Daten nur dem berechtigten Token-Inhaber und f\u00fcr die Lebensdauer des Tokens zur Verf\u00fcgung stehen.<\/p>\n<p>So, nun kommt der Zugriff \u00fcber Java auf den Vault, aber das im Teil 2.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Auf dem Raspberry Pi Zero 2 W wollte ich mal einen HashiCorp Vault installieren. Ich habe dazu ein Kali 32-Bit System verwendet, aber es l\u00e4uft auch analog auf anderen Systemen. Ziel ist es per Java und AppRole Workflow auf den Vault mit diesem Workflow zuzugreifen: Hier die Schritte im \u00dcberblick die gezeigt werden: Teil 1: &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22867\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eHashiCorp Vault auf Raspberry PI mit Kali per Java zugreifen &#8211; Wie? (Teil 1)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4606,1023,6154],"tags":[6236,1603,6234,2232,2178,1121,6235,2789,1021],"class_list":["post-22867","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-crypto","category-raspberry-pi","category-rasperry-pi-zero-2-w","tag-cubbyhole","tag-curl","tag-hashicorp","tag-https","tag-java","tag-kali","tag-vault","tag-zero","tag-zertifikate"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22867","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22867"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22867\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22867"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}