Skip to content

Commit

Permalink
Translate Terraform
Browse files Browse the repository at this point in the history
  • Loading branch information
53845714nF committed Sep 27, 2024
1 parent 7034391 commit 2dfddb7
Show file tree
Hide file tree
Showing 4 changed files with 214 additions and 61 deletions.
Binary file modified content/blog/terraform/img/terraform.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/blog/terraform/img/terraform_old.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
136 changes: 136 additions & 0 deletions content/blog/terraform/index.en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
---
title: "Terraform ☁️"
date: 2022-08-28T23:27:25+02:00
draft: false
hideLastModified: true
summaryImage: "img/terraform.png"
keepImageRatio: true
summary: "A first insight into Terraform with the interaction to Digital Ocean."
showInMenu: false
tags: ["Terraform", "DevOps", "IaC"]
---

Terraform is a powerful tool that enables **Infrastructure as Code (IaC)** management.
It is particularly useful for large cloud environments, automating the provisioning,
management, and scaling of resources.
In this post, I will describe how I used Terraform to create virtual machines (VMs) on [DigitalOcean](https://www.digitalocean.com) and deployed the Juice Shop project on them.

**Note**: Juice Shop is a deliberately insecure web application designed to teach security testing.
It should only be used for educational purposes and never in a production environment.

## Installing Terraform ✨

Installing Terraform on Ubuntu or Debian is straightforward. You can set it up quickly using the following commands:

{{< codeWide >}}
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg]https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
{{< /codeWide >}}

## Building a Terraform Configuration File

Terraform configurations are written in files that define the infrastructure resources you want to create.
Below is a basic example of how to configure Terraform to create VMs on DigitalOcean.

### Defining the Provider

First, the cloud provider must be specified.
Terraform supports many providers such as Amazon AWS, Microsoft Azure, and others.
For this test, I chose DigitalOcean as it offers a simpler alternative to larger providers.

Here’s the code to configure the DigitalOcean provider:
{{< codeWide >}}
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
{{< /codeWide >}}

After defining the provider, Terraform needs access to your DigitalOcean account via an API token.
This token can be passed to Terraform through environment variables or a secret management tool.
For simplicity, I have included it directly in the code (though this is not recommended for production):

{{< codeWide >}}
provider "digitalocean" {
token = "YOUR_DIGITALOCEAN_TOKEN"
}
{{< /codeWide >}}

### Defining Resources

Now we can define resources, such as a droplet, which is DigitalOcean's term for a VM.

{{< codeWide >}}
resource "digitalocean_droplet" "web" {
count = 1
image = "ubuntu-22-04-x64"
name = "saftig.${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
ssh_keys = [""]
{{< /codeWide >}}

The `count` parameter defines how many VMs to create.
Terraform makes it as easy to create 200 VMs as it is to create two.

For SSH access, you need to provide the fingerprints of your SSH keys, which must be pre-registered with DigitalOcean.

### Establishing a Connection

To execute commands on the VMs, we need to set up an SSH connection:
{{< codeWide >}}
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file("PATH_TO_SSH_KEY")
timeout = "2m"
}
{{< /codeWide >}}

### Installing Juice Shop 🧃

Once the VMs are created, we can use `podman` to pull and run the Juice Shop container on the droplets:
{{< codeWide >}}
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install Juice Shop
"sudo apt install -y podman",
"sudo podman pull docker.io/bkimminich/juice-shop",
"sudo podman run -d --rm -p 3000:3000 bkimminich/juice-shop"
]
}
}
{{< /codeWide >}}

This pulls and starts the Juice Shop container.

## Useful Terraform Commands

Terraform uses a similar command structure to Git.
Here are some of the key commands:

- To apply your configuration and provision resources:
{{< codeWide >}}
terraform apply
{{< /codeWide >}}

- To view the current state of your deployment:
{{< codeWide >}}
terraform show
{{< /codeWide >}}

- Um alle erstellten Ressourcen wieder zu löschen:
{{< codeWide >}}
terraform destroy
{{< /codeWide >}}

## Conclusion 🎉
I was really impressed with how easy it was to get started with Terraform.
I can definitely see myself using it for more projects in the future, especially with its ability to manage infrastructure at scale with minimal effort.
139 changes: 78 additions & 61 deletions content/blog/terraform/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,133 +5,150 @@ draft: false
hideLastModified: true
summaryImage: "img/terraform.png"
keepImageRatio: true
summary: "Terraform ist ein Tool zum Wolken bauen. Ein erster Einblick im Zusammenspiel mit Digital Ocean"
summary: "Terraform ist ein Tool zum Wolken bauen. Ein erster Einblick im Zusammenspiel mit Digital Ocean."
showInMenu: false
tags: ["Terraform", "DevOps", "IaC"]
---

## Erste Schritte bei Digital Ocean
Terraform ist ein mächtiges Tool, das es ermöglicht, **Infrastruktur als Code (IaC)** zu verwalten.
Es ist besonders nützlich für große Cloud-Umgebungen, da es die Bereitstellung, Verwaltung und Skalierung von Ressourcen automatisiert.
In diesem Erfahrungsbericht beschreibe ich,
wie ich mithilfe von Terraform virtuelle Maschinen (VMs) bei [DigitalOcean](https://www.digitalocean.com)
erstellt und darauf das [Juice Shop](https://owasp.org/www-project-juice-shop/) Projekt bereitgestellt habe.

Terraform ist ein Tool, das es ermöglicht, Infrastruktur als Code abzubilden und ist insbesondere für große Cloud-Instanzen gedacht. In diesem Erfahrungsbericht werde ich beschreiben, wie ich mit Hilfe von Terraform virtuelle Maschinen (VMs) bei Digital Ocean erstellt habe und auf ihnen das Projekt [Juice Shop](https://owasp.org/www-project-juice-shop/) zum Laufen gebracht habe.
**Hinweis**: Juice Shop ist ein absichtlich unsicheres Webprojekt, das zur Übung von Sicherheitsprüfungen dient.
Es sollte nur zu Lernzwecken verwendet und niemals in einer Produktionsumgebung betrieben werden.

Hinweis: Juice Shop ist ein Projekt, das absichtlich Web-Schwachstellen enthält. Es dient nur zu Lernzwecken und ist nicht für den produktiven Einsatz gedacht.

## Installation
## Installation von Terraform ✨

Die Installation von Terraform ist einfach. Unter Ubuntu kann es wie folgt installiert werden:
Die Installation von Terraform unter Ubuntu oder Debian ist unkompliziert.
Mit den folgenden Befehlen kann es schnell eingerichtet werden:

{{< codeWide >}}
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg]https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
{{< /codeWide >}}

## Aufbau eines Terraform-Files
## Aufbau einer Terraform-Konfigurationsdatei
Terraform-Konfigurationen werden in Dateien geschrieben, die die Bereitstellung von Infrastruktur definieren.
Im Folgenden zeige ich den grundlegenden Aufbau einer Konfiguration, um VMs auf DigitalOcean zu erstellen.

Der Aufbau eines Terraform-Files besteht darin, Code in eine Datei zu schreiben, die Terraform ausführen wird.

### Festlegen des Providers

Zunächst muss der Provider definiert werden. Hierfür gibt es verschiedene Anbieter die Terraform unterstützt. Die bekanntesten Anbieter sind Amazon's AWS und Microsoft's Azure. Es gibt jedoch auch viele andere Provider. Es ist sogar möglich, mit der eigenen Cloud zu kommunizieren, z.B. mit K8S, VMware oder auch Proxmox.
Zunächst muss der Cloud-Provider festgelegt werden.
Terraform unterstützt viele Anbieter, wie AWS, Microsoft Azure und andere.
Es ist sogar möglich, mit der eigenen Cloud zu kommunizieren, z.B. mit Kubernetes, VMware oder auch Proxmox.
In meinem Test habe ich DigitalOcean verwendet, da die Anzahl der zu verfügung stehenden Dienste überschaubar ist.

In meinem Test habe ich mich für [Digital Ocean](https://www.digitalocean.com) entschieden. Es ist nicht sehr günstig, aber es gibt gelegentlich Rabattcodes, um ihre Produkte zu testen.
Digital Ocean ist ein recht kleiner Cloud-Anbieter, der keine so komplexe Struktur wie AWS hat.

Um einen Provider in Terraform zu konfigurieren, wird ein `main.tf` File erstellt. Der Code für Digital Ocean sieht wie folgt aus:

Hier ist der Code, um den DigitalOcean-Provider zu konfigurieren:
{{< codeWide >}}
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
{{< /codeWide >}}

Danach müssen wir einen Token in Digital Ocean erstellen, dieser erlaubt es Terraform dann unter euren Account, auf die Cloud zuzugreifen.
Natürlich müssen wir diesen Token dann auch Terraform mitteilen, hierfür gibt es verschiedene Methoden, da so sensible Daten nicht direkt im Code stehen sollten.
Der einfach halt halber hab ich ihn erst mal in den Code geschrieben:
Nachdem der Provider definiert ist, benötigt Terraform Zugriff auf das DigitalOcean-Konto.
Dazu muss ein API-Token erstellt werden.
Diesen Token können wir Terraform übergeben, am besten über Umgebungsvariablen oder ein Secrets-Management-System.
Der Einfachheit halber habe ich ihn direkt im Code hinterlegt (dies sollte jedoch in der Praxis vermieden werden):

{{< codeWide >}}
provider "digitalocean" {
token = ""
token = "DEIN_DIGITALOCEAN_TOKEN"
}
{{< /codeWide >}}

Anstelle von "" muss der Token von Digital Ocean eingefügt werden.

### Anlegen von Ressourcen
### Ressourcen anlegen

Nun können wir Ressourcen definieren, in unserem Fall eine Droplet, was der Begriff für VMs bei Digital Ocean ist.
Nun können wir Ressourcen, wie eine Droplet-VM, definieren.
Eine Droplet ist bei DigitalOcean der Begriff für eine VM.

{{< codeWide >}}
resource "digitalocean_droplet" "web" {
count = 1
image = "ubuntu-22-04-x64"
name = "saftig.${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
ssh_keys = [""]
count = 1
image = "ubuntu-22-04-x64"
name = "saftig.${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
ssh_keys = [""]
{{< /codeWide >}}

Der `count` gibt an, wie viele VMs erzeugt werden sollen. Dies ist optional. Ich habe das ergänzt, um zu sehen, wie es ist, mehrere VMs gleichzeitig zu erstellen. So wie ich das sehe, ist hier eine der Stärken von Terraform. Es macht genauso viel Aufwand, zwei VMs zu erzeugen wie 200.
Der Parameter `count` gibt die Anzahl der zu erstellenden VMs an.
Mit Terraform lässt sich problemlos eine große Anzahl von Instanzen bereitstellen, ohne zusätzlichen Aufwand.
So ist es beispielsweise genauso einfach, zwei VMs zu erstellen wie 200.

Bei den `ssh_keys` müssen die Fingerprints der SSH-Keys eingetragen werden. Diese müssen jedoch schon bei Digital Ocean hinterlegt sein.
Für die SSH-Verbindung müssen zuvor die Fingerprints der SSH-Keys bei DigitalOcean hinterlegt werden.

### Connection definieren

Um nun Commands auf den Servern auszuführen, muss die Verbindung aufgebaut werden. Dies passiert über SSH.
### Verbindung zu den VMs herstellen

Um Befehle auf den VMs auszuführen, wird eine SSH-Verbindung benötigt:
{{< codeWide >}}
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file("")
timeout = "2m"
}
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file("")
timeout = "2m"
}
{{< /codeWide >}}

Bei `private_key` muss der Pfad zum File eingetragen werden.

### Installation von Juice Shop 🧃
Es folgen nun die Commands, die nach dem Erstellen der VM ausgeführt werden.

{{< codeWide >}}
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install Juice Shop
"sudo apt install -y podman",
"sudo podman pull docker.io/bkimminich/juice-shop",
"sudo podman run -d --rm -p 3000:3000 bkimminich/juice-shop"
]
}
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install Juice Shop
"sudo apt install -y podman",
"sudo podman pull docker.io/bkimminich/juice-shop",
"sudo podman run -d --rm -p 3000:3000 bkimminich/juice-shop"
]
}
}
{{< /codeWide >}}

Hier wird mit `podman` der Container von Juice Shop geladen und ausgeführt.

## Terraform Commands
Hiermit wird der Juice Shop-Container heruntergeladen und gestartet, mithilfe von `podman`.

## Nützliche Terraform-Befehle

Die Terraform Commands sind ähnlich wie Git aufgebaut. Es gibt den `terraform` Command und dieser hat verschiedene Sub-Commands.
Terraform arbeitet ähnlich wie Git mit verschiedenen Sub-Kommandos.
Im Folgenden die wichtigsten:

Mit `apply` können wir nun unseren Code ausrollen:

- Um die Infrastruktur bereitzustellen, verwenden wir:
{{< codeWide >}}
terraform apply
{{< /codeWide >}}

Unser aktuelles Deployment können wir mit `show` ansehen:
- Um sich den aktuellen Zustand der Ressourcen anzusehen:
{{< codeWide >}}
terraform show
{{< /codeWide >}}

Mit `destroy` können wir unser Werk auch wieder schnell zerstören.
- Um alle erstellten Ressourcen wieder zu löschen:
{{< codeWide >}}
terraform destroy
{{< /codeWide >}}

## Fazit
## Fazit 🎉

Terraform hat mich beeindruckt.
Der Einstieg war überraschend einfach, und ich konnte in kürzester Zeit Infrastruktur bereitstellen.
Besonders die Fähigkeit, Infrastruktur skalierbar und wiederholbar zu verwalten,
macht Terraform für zukünftige Projekte sehr interessant.

Ich war sehr positiv beeindruckt, wie einfach der Einstieg in Terraform ist. Ich kann mir vorstellen, dass ich das in Zukunft noch öfter für Projekte einsetzen werde.
Falls Sie Anmerkungen, Vorschläge oder Fragen haben, können Sie sich gerne per E-Mail, LinkedIn oder GitHub bei mir melden.

0 comments on commit 2dfddb7

Please sign in to comment.