From 735a670a577fc5559f1c435239a8135e04d8a3f7 Mon Sep 17 00:00:00 2001 From: Aishwarya Chakravarthy Date: Wed, 26 Jul 2023 12:30:42 -0400 Subject: [PATCH] [docs] Hashicorp vault integration (#18395) * part of the content added * added hashicorp vault intg * edit * some typos and edits * added link * misc comments * review comments * minor edits * Add partner page link --------- Co-authored-by: Dwight Hodge --- docs/content/preview/integrations/_index.md | 6 + .../preview/integrations/hashicorp-vault.md | 164 ++++++++++++++++++ .../develop/ecosystem/hashicorp-vault.png | Bin 0 -> 25572 bytes 3 files changed, 170 insertions(+) create mode 100644 docs/content/preview/integrations/hashicorp-vault.md create mode 100644 docs/static/images/section_icons/develop/ecosystem/hashicorp-vault.png diff --git a/docs/content/preview/integrations/_index.md b/docs/content/preview/integrations/_index.md index b8aa8758220b..c760436c05c1 100644 --- a/docs/content/preview/integrations/_index.md +++ b/docs/content/preview/integrations/_index.md @@ -114,6 +114,12 @@ For information on YugabyteDB-compatible drivers and ORMs, refer to [Drivers and +
  • + + + Hashicorp Vault + +
  • diff --git a/docs/content/preview/integrations/hashicorp-vault.md b/docs/content/preview/integrations/hashicorp-vault.md new file mode 100644 index 000000000000..a1ac47945e41 --- /dev/null +++ b/docs/content/preview/integrations/hashicorp-vault.md @@ -0,0 +1,164 @@ +--- +title: Hashicorp Vault +linkTitle: Hashicorp Vault +description: Use YSQL plugin for Hashicorp Vault +aliases: +menu: + preview_integrations: + identifier: hashicorp-vault + parent: integrations + weight: 571 +type: docs +--- + +[HashiCorp Vault](https://www.hashicorp.com/products/vault) is designed to help organizations manage access to secrets and transmit them safely. + +Secrets are any form of sensitive credentials that need to be tightly controlled and monitored and can be used to unlock sensitive information. Secrets can be in the form of passwords, API keys, SSH keys, RSA tokens, or OTP. For more details, refer to [Dynamic secrets](https://github.com/yugabyte/hashicorp-vault-ysql-plugin#dynamic-secrets). + +## YSQL plugin for Hashicorp Vault + +YSQL plugin for Hashicorp Vault provides APIs for using HashiCorp Vault dynamic secrets with YugabyteDB. The plugin includes APIs for adding YugabyteDB to manage secrets, creating new users, and managing [leases](https://developer.hashicorp.com/vault/docs/concepts/lease). + +For more details, refer to [YSQL plugin for Hashicorp Vault](https://github.com/yugabyte/hashicorp-vault-ysql-plugin#ysql-plugin-for-hashicorp-vault-1). + +## Setup + +Your YugabyteDB cluster should be up and running. Refer to [YugabyteDB Prerequisites](../../tools/#yugabytedb-prerequisites). + +Install Hashicorp Vault. See [Installing Vault](https://developer.hashicorp.com/vault/docs/install). + +Before using Vault, do the following: + +- Add go to the path as follows: + + ```sh + export GOPATH=$HOME/go + export PATH=$PATH:$GOROOT/bin:$GOPATH/bin + ``` + +- To run Vault in [development mode](https://developer.hashicorp.com/vault/docs/concepts/dev-server), add the default vault address and vault token as follows: + + ```sh + export VAULT_ADDR="http://localhost:8200" + export VAULT_TOKEN="root" + ``` + +- For production mode, register the plugin as follows: + + ```sh + export SHA256=$(sha256sum /ysql-plugin | cut -d' ' -f1) + + vault write sys/plugins/catalog/database/ysql-plugin \ + sha256=$SHA256 \ + command="ysql-plugin" + ``` + +Install the YSQL plugin for Hashicorp Vault as follows: + +- Clone the `hashicorp-vault-ysql-plugin` repository: + + ```sh + git clone https://github.com/yugabyte/hashicorp-vault-ysql-plugin && cd hashicorp-vault-ysql-plugin + ``` + +- Build the plugin as follows: + + ```go + go build -o /ysql-plugin cmd/ysql-plugin/main.go + ``` + +## Run and configure the vault server + +Start the Vault server using the [server](https://developer.hashicorp.com/vault/docs/commands/server) command with the following flags: + +- To have Vault automatically register the plugin, provide the path to the directory containing the plugin binary using the `-dev-plugin-dir` flag. +- Set the `-dev-root-token` flag to inform the vault to use the default vault token of root to login (this token is required in production mode). +- To run the server in development mode, use the `-dev` flag; development mode makes it easier to experiment with Vault or start a Vault instance for development. + +{{< warning title="Don't run Development mode in production" >}} +Never run development mode in production. It is insecure and will lose data on every restart (as it stores data in memory). Development mode is only suitable for development or experimentation. +{{< /warning >}} + +For example, you can start the server as follows: + +```sh +vault server -dev -dev-root-token-id=root -dev-plugin-dir= +``` + +Enable the database's secrets as follows: + +```sh +vault secrets enable database +``` + +You can add the database using one of the following options: + +- Enter the credentials: + + ```sh + vault write database/config/yugabytedb plugin_name=ysql-plugin \ + host="127.0.0.1" \ + port=5433 \ + username="yugabyte" \ + password="yugabyte" \ + db="yugabyte" \ + load_balance=true \ + yb_servers_refresh_interval=0 \ + allowed_roles="*" + ``` + +- Use a connection string: + + ```sh + vault write database/config/yugabytedb \ + plugin_name=ysql-plugin \ + connection_url="postgres://{{username}}:{{password}}@localhost:5433/yugabyte?sslmode=disable&load_balance=true&yb_servers_refresh_interval=0" \ + allowed_roles="*" \ + username="yugabyte" \ + password="yugabyte" + ``` + +For more information on running Vault, refer to the [Vault documentation](https://developer.hashicorp.com/vault/docs). + +## Use the plugin + +Create a role as follows: + +```sh +vault write database/roles/my-first-role \ +db_name=yugabytedb \ +creation_statements="CREATE ROLE \"{{username}}\" WITH PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOINHERIT LOGIN; \ + GRANT ALL ON DATABASE \"yugabyte\" TO \"{{username}}\";" \ +default_ttl="1h" \ +max_ttl="24h" +``` + +Create a user as follows: + +```sh +vault read database/creds/my-first-role +``` + +To manage leases for YugabyteDB, including lookup, renewal, and revocation, provide the [lease ID](https://developer.hashicorp.com/vault/docs/concepts/lease#lease-ids) along with the following commands: + +```sh +# Lease lookup +vault lease lookup +``` + +```sh +# Renew the lease +vault lease renew +``` + +```sh +#Revoke the lease +vault lease revoke +``` + +## Learn more + +- [Database static roles and credential rotation](https://developer.hashicorp.com/vault/tutorials/db-credentials/database-creds-rotation) +- [Database root credential rotation](https://developer.hashicorp.com/vault/tutorials/db-credentials/database-root-rotation) +- [Username templating](https://developer.hashicorp.com/vault/tutorials/secrets-management/username-templating) +- [YugabyteDB partner page at Hashicorp](https://www.hashicorp.com/partners/tech/yugabyte#all) diff --git a/docs/static/images/section_icons/develop/ecosystem/hashicorp-vault.png b/docs/static/images/section_icons/develop/ecosystem/hashicorp-vault.png new file mode 100644 index 0000000000000000000000000000000000000000..7753d5a50b6659056b6fb55a025e2f3f84757703 GIT binary patch literal 25572 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 oECm`NQih~Netb!0%g|={ISzZAS!F4VFr_