This folder shows an example of how to use the openvpn-server module to launch the necessary
components to serve as an OpenVPN host and to manage OpenVPN user accounts.
Quick start
To try these templates out you must have Terraform installed (minimum version: 0.8.0):
Open vars.tf, set the environment variables specified at the top of the file, and fill in any other variables that
don't have a default.
Pass in the desired variables to the openvpn-server TF module:
Your team will need the ability to connect to resources hosted on EC2 Instances that you may not want to make accessible
to the entire Internet.
Opening all these services directly is not advisable because then we have multiple servers and services that represent
potential attack vectors into your environment. Instead, the best practice is to have a single server that's exposed to
the public -- an "OpenVPN host" -- on which we can focus all our efforts for locking down.
As a result, we place the OpenVPN host in the public subnet, and all other servers should be located in private subnets.
Once connected to the OpenVPN host, you can then connected to other services located on your private EC2 Instances.
OpenVPN AMI
The OpenVPN host can run any reasonably secure Linux distro. In this example, we use an Ubuntu AMI built in the
packer example.
Officially supported OS distros for this package
Ubuntu 16.04
Ubuntu 18.04
Ubuntu 20.04
OpenVPN access
Once you have requested and received an OpenVPN Client Configuration (.ovpn) file using the
openvpn-admin tool, you can import that into any supported OpenVPN client.
Once connected to the VPN, your traffic is encrypted and "tunneled" and you are effectively "in the network".
You can then connect to any other EC2 instance or service in the account, including those in the private subnets of the
VPC.
Known Limitations
When you first run the OpenVPN server it will take a long time, often 10 minutues or more until the first-time initialization
of the public key infrastructure (PKI) necessary for running OpenVPN has initialized. You can tell that this process is
complete once the /etc/openvpn/openvpn-init-complete file has been created.
Questions? Ask away.
We're here to talk about our services, answer any questions, give advice, or just to chat.
{"treedata":{"name":"root","toggled":true,"children":[{"name":".circleci","children":[{"name":"config.yml","path":".circleci/config.yml","sha":"2b3ceae62420b4fd9ef7413f400619f24e05ac62"},{"name":"post-upgrade-test-results.sh","path":".circleci/post-upgrade-test-results.sh","sha":"a4867e8fbdc334b7a90259568ee41ea577fbe764"},{"name":"set-upgrade-test-vars.sh","path":".circleci/set-upgrade-test-vars.sh","sha":"0978a60d00cfb4a959a939b71d9e9d5929d9baff"}]},{"name":".github","children":[{"name":"ISSUE_TEMPLATE","children":[{"name":"bug_report.md","path":".github/ISSUE_TEMPLATE/bug_report.md","sha":"d2e87e27c601e423865ed660ec697082470ca60f"},{"name":"feature_request.md","path":".github/ISSUE_TEMPLATE/feature_request.md","sha":"023a33099be2336476930c96e17ff1ba5dc55348"}]},{"name":"pull_request_template.md","path":".github/pull_request_template.md","sha":"6b100e40e323b5b07f40ed30616277c51c9f4b9e"}]},{"name":".gitignore","path":".gitignore","sha":"dc2eb8ea5e17708df66634ed2f95c8c5e973daed"},{"name":".patcher","children":[{"name":"patches","children":[{"name":"v0.20.0","children":[{"name":"iam-inline-policies","children":[{"name":"patch.yaml","path":".patcher/patches/v0.20.0/iam-inline-policies/patch.yaml","sha":"227e840b5996bae65ce9984c9e1398226a5d8141"},{"name":"var_use_managed_iam_policies.sh","path":".patcher/patches/v0.20.0/iam-inline-policies/var_use_managed_iam_policies.sh","sha":"e5eb47cf889c6e28fec50f34e973ef8c3c5ec2f3"}]}]},{"name":"v0.21.0","children":[{"name":"terraform-1.1-upgrade","children":[{"name":"bump_required_version.sh","path":".patcher/patches/v0.21.0/terraform-1.1-upgrade/bump_required_version.sh","sha":"30abb1d075dbc85ce83dc415869de1c9c8560b0d"},{"name":"patch.yaml","path":".patcher/patches/v0.21.0/terraform-1.1-upgrade/patch.yaml","sha":"1b27c37854276ff6fa550c1211dac23cb61d6ac5"}]}]},{"name":"v0.22.0","children":[{"name":"disable-ebs-optimization","children":[{"name":"patch.yaml","path":".patcher/patches/v0.22.0/disable-ebs-optimization/patch.yaml","sha":"793d51f95be26299442847ac2f9ae523200b7bb1"},{"name":"set_var_ebs_optimized_to_false.sh","path":".patcher/patches/v0.22.0/disable-ebs-optimization/set_var_ebs_optimized_to_false.sh","sha":"870246ddb1d2d902fc830d080e278372110ddc24"}]}]},{"name":"v0.23.0","children":[{"name":"aws-provider-4.x","children":[{"name":"bump_provider.sh","path":".patcher/patches/v0.23.0/aws-provider-4.x/bump_provider.sh","sha":"d3daee144dd21814811d998e5ae69796b9956509"},{"name":"create_script_for_terraform_init.sh","path":".patcher/patches/v0.23.0/aws-provider-4.x/create_script_for_terraform_init.sh","sha":"c38f2bb4802978301590d1a045037655e54995e3"},{"name":"patch.yaml","path":".patcher/patches/v0.23.0/aws-provider-4.x/patch.yaml","sha":"f287d938e73b1b3fbbd3912c31f429d73416c468"}]}]},{"name":"v0.24.0","children":[{"name":"aws-provider-4.x","children":[{"name":"bump_provider.sh","path":".patcher/patches/v0.24.0/aws-provider-4.x/bump_provider.sh","sha":"7c61315127a8c8471a2688c089e23963161d5d35"},{"name":"create_script_for_terraform_init.sh","path":".patcher/patches/v0.24.0/aws-provider-4.x/create_script_for_terraform_init.sh","sha":"10a61b3d3b064715829a8635464cb45df2fa6608"},{"name":"patch.yaml","path":".patcher/patches/v0.24.0/aws-provider-4.x/patch.yaml","sha":"284408766ca98c795d72d9f0dcb7482e948fda08"}]}]}]}]},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","sha":"ef4c514168a04923df9033bb2ea77801b035eef5"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"ba6f6b4ca9979f15f13a1002e4d6edbeca674637"},{"name":"LICENSE.txt","path":"LICENSE.txt","sha":"5ae97660cb6e3a07b61c971f1a25edf402e90f53"},{"name":"README.md","path":"README.md","sha":"a04049315ec75ca736c9a2c562eb97ac24679a6e"},{"name":"examples","children":[{"name":"openvpn-host-duo","children":[{"name":"README.md","path":"examples/openvpn-host-duo/README.md","sha":"1a3065f058745f0f03fd74844ac4e872d52538de"},{"name":"main.tf","path":"examples/openvpn-host-duo/main.tf","sha":"bc5a44c2030d8c471ff9ba045681b427fbc909ab"},{"name":"outputs.tf","path":"examples/openvpn-host-duo/outputs.tf","sha":"f527145f657a5a99d32c301c591f461f2230e3b9"},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/openvpn-host-duo/user-data/user-data.sh","sha":"11d8cb4fd9efc019a506a848eb8312d26f8d9b26"}]},{"name":"vars.tf","path":"examples/openvpn-host-duo/vars.tf","sha":"280eaddae0870e2815aab482f81e73e19754c15f"}]},{"name":"openvpn-host","children":[{"name":"README.md","path":"examples/openvpn-host/README.md","sha":"851c84174ea25ce2dbf01aae7a3764a5208f553d","toggled":true},{"name":"main.tf","path":"examples/openvpn-host/main.tf","sha":"15b314bc2e17bbdfb79d5473e7245b882b7df5bd"},{"name":"outputs.tf","path":"examples/openvpn-host/outputs.tf","sha":"f527145f657a5a99d32c301c591f461f2230e3b9"},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/openvpn-host/user-data/user-data.sh","sha":"efee4866142d928414e821e5bde470f5bdb1a2bf"}]},{"name":"vars.tf","path":"examples/openvpn-host/vars.tf","sha":"542775561463c32dde942a809ad0736d71a83b5a"}],"toggled":true},{"name":"packer-duo","children":[{"name":"README.md","path":"examples/packer-duo/README.md","sha":"d885b8114f2af50fb01d4707e56bb81ae79da798"},{"name":"build.json","path":"examples/packer-duo/build.json","sha":"277b1569ac194f72c2796089870a9c8b366373e5"}]},{"name":"packer","children":[{"name":"README.md","path":"examples/packer/README.md","sha":"7c3444a90e7bd6ffd8dd0d281439a03d01827d68"},{"name":"build.json","path":"examples/packer/build.json","sha":"0202c80862a2758391cb07b3753ffc6d76f20f38"}]}],"toggled":true},{"name":"modules","children":[{"name":"backup-openvpn-pki","children":[{"name":"README.md","path":"modules/backup-openvpn-pki/README.md","sha":"d271084a97e3ea953afb0e9e690fac951bb6be6d"},{"name":"bin","children":[{"name":"backup-openvpn-pki","path":"modules/backup-openvpn-pki/bin/backup-openvpn-pki","sha":"90effb15d572fb909c10c45cfd7bb496f6efb748"}]},{"name":"install.sh","path":"modules/backup-openvpn-pki/install.sh","sha":"af225b1dcd43eaab802a9e8040b3d39e25dd46a0"}]},{"name":"init-openvpn","children":[{"name":"README.md","path":"modules/init-openvpn/README.md","sha":"3a55b2c92611085870730ea15d589723b31dc775"},{"name":"bin","children":[{"name":"init-openvpn","path":"modules/init-openvpn/bin/init-openvpn","sha":"6446e18cb12aa1f21cf565905a5e8fbdbabf98d9"}]},{"name":"install.sh","path":"modules/init-openvpn/install.sh","sha":"9a41f990f62b2a9b526edfa813075cff277e1312"}]},{"name":"install-openvpn","children":[{"name":"README.md","path":"modules/install-openvpn/README.md","sha":"6073ab56f3a3ca0a69ca949a8a1e6086d7797709"},{"name":"bin","children":[{"name":"install-openvpn","path":"modules/install-openvpn/bin/install-openvpn","sha":"3927f5cbeaf08966f9132c161187915186c5a1f2"}]},{"name":"files","children":[{"name":"before.rules","path":"modules/install-openvpn/files/before.rules","sha":"e9f11106dda0d258910a36d88b3cac05c0d85146"},{"name":"openvpn-client.ovpn","path":"modules/install-openvpn/files/openvpn-client.ovpn","sha":"3fe8af5d74c724399d2b2acaaac3e5d07889912f"},{"name":"ufw-default","path":"modules/install-openvpn/files/ufw-default","sha":"ff5e7f69b1f65a2760579d4aa7575b278273e56b"},{"name":"vars.local","path":"modules/install-openvpn/files/vars.local","sha":"b19ce7da2758a7792a05d7563201127f8b1542c9"}]},{"name":"install.sh","path":"modules/install-openvpn/install.sh","sha":"65c8ed227131e94e7db76f47093f05b953950d07"},{"name":"scripts","children":[{"name":"generate-wrapper.sh","path":"modules/install-openvpn/scripts/generate-wrapper.sh","sha":"34d49724be9c3555a886d3cf00cf9cdbcb2a43bf"},{"name":"revoke-wrapper.sh","path":"modules/install-openvpn/scripts/revoke-wrapper.sh","sha":"d158a871cdd70cfed92418b6618d81c6bef08bd7"}]}]},{"name":"openvpn-admin","children":[{"name":".dockerignore","path":"modules/openvpn-admin/.dockerignore","sha":"a725465aee245635a2bd129af54858ed32c84cb8"},{"name":"Dockerfile","path":"modules/openvpn-admin/Dockerfile","sha":"d8b2de7aeb782a31932157e3a4fb183333da4259"},{"name":"README.md","path":"modules/openvpn-admin/README.md","sha":"27e205afef3ce91fb229c359693de4a99c5651f7"},{"name":"_ci","children":[{"name":"build-and-test.sh","path":"modules/openvpn-admin/_ci/build-and-test.sh","sha":"7b57f49d2a5cbce5f3e833c6e3dac767a90a92fa"},{"name":"test.sh","path":"modules/openvpn-admin/_ci/test.sh","sha":"ba48b9b10f31ca3f2e41ee3ce85e04d6ae289657"}]},{"name":"docker-compose.yml","path":"modules/openvpn-admin/docker-compose.yml","sha":"9a1c04848275d1a302063301d55b811aa0d666ed"},{"name":"go.mod","path":"modules/openvpn-admin/go.mod","sha":"ab79e395738712bb556310407f5db92bfdaee77d"},{"name":"go.sum","path":"modules/openvpn-admin/go.sum","sha":"3c87ad8ce8618d3614021bd24633a1c4159613dc"},{"name":"openvpn-request-flow-diagram.svg","path":"modules/openvpn-admin/openvpn-request-flow-diagram.svg","sha":"4c170df3fd6cf76d4c8e0bed7e1f2dbd98c08942"},{"name":"openvpn-revoke-flow-diagram.png","path":"modules/openvpn-admin/openvpn-revoke-flow-diagram.png","sha":"ccf48d05e3a492188900dfe73ea2fbc4eb3a3e29"},{"name":"scripts","children":[{"name":"build-linux-binary.sh","path":"modules/openvpn-admin/scripts/build-linux-binary.sh","sha":"3dfe844499b28878ebbb177453887bc786aec4de"},{"name":"run.sh","path":"modules/openvpn-admin/scripts/run.sh","sha":"bbcb7f9bdf8578561226954669cdb3e886093fcb"}]},{"name":"src","children":[{"name":"app","children":[{"name":"app.go","path":"modules/openvpn-admin/src/app/app.go","sha":"28e3810bc071174e385ebf2247b61bda13435971"},{"name":"cert_helpers.go","path":"modules/openvpn-admin/src/app/cert_helpers.go","sha":"020446eb604694f4e7d96157147ca8a1889d72bb"},{"name":"cmd_process_certificate_requests.go","path":"modules/openvpn-admin/src/app/cmd_process_certificate_requests.go","sha":"cf02bc05833ef0b56d83ead4d5d176e944e37636"},{"name":"cmd_process_certificate_revocation_requests.go","path":"modules/openvpn-admin/src/app/cmd_process_certificate_revocation_requests.go","sha":"74861b358fb0f6d3cb5cbad5db7300334bd82cca"},{"name":"cmd_request_new_certificate.go","path":"modules/openvpn-admin/src/app/cmd_request_new_certificate.go","sha":"c71dc8560f604ab280ef8836cbbec8871cb43777"},{"name":"cmd_revoke_certificate.go","path":"modules/openvpn-admin/src/app/cmd_revoke_certificate.go","sha":"ee774da09d7dacf3040262589f1a78d415e72f6f"},{"name":"common.go","path":"modules/openvpn-admin/src/app/common.go","sha":"c4719d234436c76dee9950728e6654ec0227c187"},{"name":"common_test.go","path":"modules/openvpn-admin/src/app/common_test.go","sha":"95a41eb26136556b11fdcd1e5b731f6700b5dfc9"},{"name":"flags.go","path":"modules/openvpn-admin/src/app/flags.go","sha":"cdc6e7119277e7d1b8ff1684fd2c5aaf45c3b732"}]},{"name":"aws_helpers","children":[{"name":"iam.go","path":"modules/openvpn-admin/src/aws_helpers/iam.go","sha":"dd72a9b653f9ef2b2c2a98f1e1aa99adab9a8ff0"},{"name":"imds.go","path":"modules/openvpn-admin/src/aws_helpers/imds.go","sha":"2e0a36ba3352deaed04ea262fd0405e37bed9e00"},{"name":"sqs.go","path":"modules/openvpn-admin/src/aws_helpers/sqs.go","sha":"16e133d97e6f28e470c44aad18870dfe8e4685c9"}]},{"name":"main.go","path":"modules/openvpn-admin/src/main.go","sha":"b3a10913aa75a4032e52a071f1b88033ef10a29c"},{"name":"ping_helpers","children":[{"name":"ping_darwin.go","path":"modules/openvpn-admin/src/ping_helpers/ping_darwin.go","sha":"2322b41ee20f31a9312d1f3fdff02c3f81bca38a"},{"name":"ping_linux.go","path":"modules/openvpn-admin/src/ping_helpers/ping_linux.go","sha":"2890ee14fcaf9360e6d800648e7b272b78ea1fed"},{"name":"ping_windows.go","path":"modules/openvpn-admin/src/ping_helpers/ping_windows.go","sha":"a61dc1671a7726907d77693e25e2679a0b8cc856"}]}]}]},{"name":"openvpn-server","children":[{"name":"README.md","path":"modules/openvpn-server/README.md","sha":"87b5f1fe56a78b2310fd3a0232d68da34ba0ab07"},{"name":"main.tf","path":"modules/openvpn-server/main.tf","sha":"a738bfd945211c92075a86367cc108b872ae438f"},{"name":"outputs.tf","path":"modules/openvpn-server/outputs.tf","sha":"47f8161b74e4e659bcaee4b985e246cae8dba8ba"},{"name":"vars.tf","path":"modules/openvpn-server/vars.tf","sha":"6b457a3d89685e38ea5e19d886e96cc3fe71408d"}]},{"name":"start-openvpn-admin","children":[{"name":"README.md","path":"modules/start-openvpn-admin/README.md","sha":"0c9902a49939a60e80a57fa0f39bfbb50eafd40a"},{"name":"bin","children":[{"name":"run-process-requests","path":"modules/start-openvpn-admin/bin/run-process-requests","sha":"c46e8124f8d940bb682d8610cbf26f6877e13f08"},{"name":"run-process-revokes","path":"modules/start-openvpn-admin/bin/run-process-revokes","sha":"28a93d013eebb6cea2101eb81629431d25b9523b"}]},{"name":"install.sh","path":"modules/start-openvpn-admin/install.sh","sha":"2af5af7f24c40136b22d50cb8cec47f7a9d2b2ac"}]}]},{"name":"terraform-cloud-enterprise-private-module-registry-placeholder.tf","path":"terraform-cloud-enterprise-private-module-registry-placeholder.tf","sha":"ae586c0fe830819580e1009d41a9074f16e65bed"},{"name":"test","children":[{"name":"README.md","path":"test/README.md","sha":"0b09878429ef9ed0b43b812a3947ba8e1264d107"},{"name":"go.mod","path":"test/go.mod","sha":"c963b682e6f0a870482e1eb04500dc61394b13d3"},{"name":"go.sum","path":"test/go.sum","sha":"c3c6829ba00cc19eea1311d0b9074e438c5b50d6"},{"name":"local-test","children":[{"name":"docker-compose.yml","path":"test/local-test/docker-compose.yml","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"}]},{"name":"openvpn_test.go","path":"test/openvpn_test.go","sha":"c0eeaac954b4f8b88b48610ad0f16f14c1cad631"},{"name":"test_helpers.go","path":"test/test_helpers.go","sha":"f250a2ee29e5c55a8fb97359083a565846575fad"},{"name":"upgrades","children":[{"name":"constants.go","path":"test/upgrades/constants.go","sha":"eb3c6ad4b94676fc1ab1313d0c10a2e3ce99996a"},{"name":"upgrade_module_openvpn_test.go","path":"test/upgrades/upgrade_module_openvpn_test.go","sha":"cfb675307aa23f7735dfb46938f25975487161d6"}]},{"name":"validation","children":[{"name":"validate_all_modules_and_examples_test.go","path":"test/validation/validate_all_modules_and_examples_test.go","sha":"33d73c385b64c4fc870033e99427e683c31dc45a"}]}]}]},"detailsContent":"<h1 class=\"preview__body--title\" id=\"open-vpn-host-examples\">OpenVPN Host Examples</h1><div class=\"preview__body--border\"></div><p>This folder shows an example of how to use the <a href=\"/repos/v0.26.3/package-openvpn/modules/openvpn-server\" class=\"preview__body--description--blue\">openvpn-server module</a> to launch the necessary\ncomponents to serve as an OpenVPN host and to manage OpenVPN user accounts.</p>\n<h2 class=\"preview__body--subtitle\" id=\"quick-start\">Quick start</h2>\n<p>To try these templates out you must have Terraform installed (minimum version: <code>0.8.0</code>):</p>\n<ol>\n<li>Open <code>vars.tf</code>, set the environment variables specified at the top of the file, and fill in any other variables that\ndon't have a default.\n<ol>\n<li>Pass in the desired variables to the <code>openvpn-server</code> TF module:\n<ul>\n<li>you will need the <code>ID</code> of the <a href=\"/repos/v0.26.3/package-openvpn/examples/packer/README.md#building-an-ami-using-the-packer-templates\" class=\"preview__body--description--blue\">AMI built with <code>Packer</code></a></li>\n</ul>\n<pre><span class=\"hljs-comment\">## Example `terraform.tfvars`</span>\n\n<span class=\"hljs-attr\">aws_account_id</span> = <span class=\"hljs-string\">\"012345678910\"</span>\n<span class=\"hljs-attr\">ami_id</span> = <span class=\"hljs-string\">\"ami-012345678910\"</span>\n<span class=\"hljs-attr\">aws_region</span> = <span class=\"hljs-string\">\"eu-west-2\"</span>\n<span class=\"hljs-attr\">keypair_name</span> = <span class=\"hljs-string\">\"keypair-name\"</span>\n<span class=\"hljs-attr\">backup_bucket_name</span> = <span class=\"hljs-string\">\"openvpn-backups-example-unique-name\"</span>\n</pre>\n</li>\n</ol>\n</li>\n<li>Run <code>terraform get</code>.</li>\n<li>Run <code>terraform plan</code>.</li>\n<li>If the plan looks good, run <code>terraform apply</code>.</li>\n</ol>\n<h2 class=\"preview__body--subtitle\" id=\"why-an-open-vpn-host\">Why an OpenVPN Host?</h2>\n<p>Your team will need the ability to connect to resources hosted on EC2 Instances that you may not want to make accessible\nto the entire Internet.</p>\n<p>Opening all these services directly is not advisable because then we have multiple servers and services that represent\npotential attack vectors into your environment. Instead, the best practice is to have a single server that's exposed to\nthe public -- an "OpenVPN host" -- on which we can focus all our efforts for locking down.</p>\n<p>As a result, we place the OpenVPN host in the public subnet, and all other servers should be located in private subnets.\nOnce connected to the OpenVPN host, you can then connected to other services located on your private EC2 Instances.</p>\n<h2 class=\"preview__body--subtitle\" id=\"open-vpn-ami\">OpenVPN AMI</h2>\n<p>The OpenVPN host can run any reasonably secure Linux distro. In this example, we use an Ubuntu AMI built in the\n<a href=\"/repos/v0.26.3/package-openvpn/examples/packer\" class=\"preview__body--description--blue\">packer example</a>.</p>\n<h2 class=\"preview__body--subtitle\" id=\"officially-supported-os-distros-for-this-package\">Officially supported OS distros for this package</h2>\n<ul>\n<li><code>Ubuntu 16.04</code></li>\n<li><code>Ubuntu 18.04</code></li>\n<li><code>Ubuntu 20.04</code></li>\n</ul>\n<h2 class=\"preview__body--subtitle\" id=\"open-vpn-access\">OpenVPN access</h2>\n<p>Once you have requested and received an OpenVPN Client Configuration (.ovpn) file using the\n<a href=\"/repos/v0.26.3/package-openvpn/modules/openvpn-admin\" class=\"preview__body--description--blue\">openvpn-admin</a> tool, you can import that into any supported OpenVPN client.</p>\n<p>Once connected to the VPN, your traffic is encrypted and "tunneled" and you are effectively "in the network".\nYou can then connect to any other EC2 instance or service in the account, including those in the private subnets of the\nVPC.</p>\n<h2 class=\"preview__body--subtitle\" id=\"known-limitations\">Known Limitations</h2>\n<p>When you first run the OpenVPN server it will take a long time, often 10 minutues or more until the first-time initialization\nof the public key infrastructure (PKI) necessary for running OpenVPN has initialized. You can tell that this process is\ncomplete once the <code>/etc/openvpn/openvpn-init-complete</code> file has been created.</p>\n","repoName":"package-openvpn","repoRef":"v0.24.3","serviceDescriptor":{"serviceName":"OpenVPN","serviceRepoName":"package-openvpn","serviceRepoOrg":"gruntwork-io","cloudProviders":["aws"],"description":"Deploy an OpenVPN server. Supports auto healing, public key infrastructure (PKI), cert backup, and managing user accounts using IAM groups.","imageUrl":"openvpn.png","licenseType":"subscriber","technologies":["Terraform","Bash","Go"],"compliance":[],"tags":[""]},"serviceCategoryName":"Client VPN access","fileName":"README.md","filePath":"/examples/openvpn-host","title":"Repo Browser: OpenVPN","description":"Browse the repos in the Gruntwork Infrastructure as Code Library."}