softasap.sa_box_bootstap

Build-Status

Beispiel für die Verwendung:

Einfach

  rollen:
     - {
         rolle: "sa-box-bootstrap",
         bereitstellungs_benutzer: "{{jenkins_user}}",
         autorisierte_schlüssel_benutzer: "{{jenkins_authorized_keys}}",
         zeitzone: "Europa/Kiew"
       }

Fortgeschritten

  variablen:
    - root_verzeichnis: ..

    - jenkins_benutzer: jenkins
      jenkins_autorisierte_schlüssel:
        - "{{playbook_dir}}/components/files/ssh/vyacheslav1.pub"
        - "{{playbook_dir}}/components/files/ssh/vyacheslav2.pub"
        - "{{playbook_dir}}/components/files/ssh/vyacheslav3.pub"
        - "{{playbook_dir}}/components/files/ssh/vyacheslav4.pub"
    - zeitzone: "Europa/Kiew"

  vor_tasks:
    - debug: msg="Vorbereitende Aufgaben"

  rollen:
     - {
         rolle: "sa-box-bootstrap",
         bereitstellungs_benutzer: "{{jenkins_user}}",
         schlüssel_bereitstellungs_benutzer: "{{playbook_dir}}/components/files/ssh/jenkins_rsa",
         öffentlicher_schlüssel_bereitstellungs_benutzer: "{{playbook_dir}}/components/files/ssh/jenkins_rsa.pub",
         autorisierte_schlüssel_benutzer: "{{jenkins_authorized_keys}}",

         zeitzone: "Europa/Kiew",

         option_initial_authorisierte_schlüssel_kopieren: true,
         option_ssh_schlüssel_login_zwingen: true,
         option_file2ban: true,
         option_firewall: true,
         option_monit: true
       }

Wichtig: Wenn Sie den Parameter deploy_user_sudo_password nicht angeben, darf der erstellte Bereitstellungsbenutzer sudo ohne Passwortbestätigung ausführen. In einigen Fällen ist das in Ordnung, aber ein zusätzliches Maß an Sicherheit schadet nie, daher:

Bereitstellungsbenutzer verlangt ein Sudo-Passwort

  variablen:
    - benutzer_autorisierte_schlüssel:
        - "~/.ssh/id_rsa.pub"
    - benutzer_sudo_pass: "geheim"

  rollen:
     - {
         rolle: "sa-box-bootstrap",
         bereitstellungs_benutzer: "slavko",
         autorisierte_schlüssel_benutzer: "{{benutzer_autorisierte_schlüssel}}",
         sudo_passwort_bereitstellungs_benutzer: "{{benutzer_sudo_pass | password_hash('sha512')}}",
         option_ssh_schlüssel_login_zwingen: ja
       }

Wenn Sie einen Bereitstellungsbenutzer haben, der die Eingabe eines Sudo-Passworts erfordert, müssen Sie es über den Parameter ansible_become_password bereitstellen.

registrieren
$BOX_PLAYBOOK
$BOX_NAME
$BOX_ADDRESS
$BOX_USER
$BOX_PWD

ausführlich 4
setze box_address $BOX_ADDRESS
setze ansible_become_password geheim

bereitstellen $BOX_NAME

Bereiten Sie Ihre Box für die Bereitstellung vor

Hintergrund

Heutzutage haben sich Bereitstellungen von Bare-Metal-Servern zu schnell gestarteten virtuellen Maschinen verschoben, wie sie von Amazon, Digital Ocean und OpenStack-basierten Anbietern bereitgestellt werden. Daher erfordert die Konfiguration der Box keine manuellen Administrationsschritte mehr. Eine der Optionen sind bereit zu verwendende vorkonfigurierte Box-Images. Ein anderer Ansatz ist es, mit einem Neustart des Systems zu beginnen und es gemäß den Projektanforderungen mit einem Provisioner wie Ansible, Chef oder Puppet bereitzustellen.

Der erste Schritt zum benutzerdefinierten Provisioning - ist die grundlegende Sicherung der Box durchzuführen, da Ihnen in einigen Fällen eine frisch installierte Box mit dem Root-Passwort zur Verfügung gestellt wird.

Ich möchte Ihnen ein schnelles Rezept zur ersten Sicherung der Box mitteilen, das für die meisten Web-Bereitstellungen gut sein sollte.

Herausforderungen

Am Ende des Artikels sollten wir in der Lage sein, einen Ubuntu 14.04 LTS virtuellen Server zu sichern.

  • Konfigurieren Sie die Firewall, um nur 22, 443 und 80 zuzulassen.
  • Registrieren Sie Ihren öffentlichen Schlüssel(e) für den Bereitstellungsbenutzer.
  • Sichern Sie SSH, um nur die Autorisierung durch Schlüssel zuzulassen.
  • Implementieren Sie einen automatischen Prozess, um diejenigen zu sperren, die versuchen, von außen auf den offenen SSH-Port zuzugreifen.

Bootstrap Box Rolle

Ansible kommt mit einem schönen Konzept zur Wiederverwendung von Bereitstellungs-Snippets, das als Rollen bezeichnet wird. Schauen wir uns an, was die Rolle sa-box-bootstrap tut:

Konfigurationsoptionen

Die folgenden Variablen können überschrieben werden:

  • root_verzeichnis - erforderlich, Ansible Entwicklerrezepte Repository
  • option_ssh_schlüssel_login_zwingen (true|false) - ob die SSH-Sicherheit durchgesetzt werden soll
  • ufw_regeln_standard - Standard-Firewall-Richtlinie. In den meisten Fällen wird nichts daran geändert.
  • ufw_regeln_zulassen - Satz von eingehenden Regeln, die konfiguriert werden sollen
  • sshd_config_zeilen - benötigte Änderungen in der SSHD-Konfiguration, um die Box zu sichern.
  • option_file2ban - wenn true, wird das File2ban-Paket zusätzlich installiert.
  • genehmigte_ips - Satz von IPs, die als sicher gelten - z.B. Ihr Büro-Gateway, Build-Server usw.; Um zu verhindern, dass Sie versehentlich blockiert werden.

Schritt 1: Firewall aktivieren

Der erste Schritt besteht darin, die ufw-Firewall zu installieren und zu konfigurieren:

- include: "{{root_dir}}/tasks_ufw.yml"

Standardmäßig gelten die folgenden Firewall-Regeln (ausgehende Verbindungen sind erlaubt, http, https & ssh sind zugelassen):

ufw_regeln_standard:
  - {
      policy: deny,
      direction: incoming
    }
  - {
      policy: allow,
      direction: outgoing
    }

ufw_regeln_zulassen:
  - {
      port: 80,
      proto: tcp
     }
  - {
      port: 443,
      proto: tcp
    }
  - {
      port: 22,
      proto: tcp
     }

Sie können diese Variablen überschreiben, um Ihren Bedürfnissen gerecht zu werden.

Schritt 2: Bereitstellungsbenutzer erstellen

Wenn Sie diese Box verwenden und bereitstellen möchten, möchten Sie es wahrscheinlich nicht als Root tun. Daher ist der zweite Schritt die Erstellung eines Bereitstellungsbenutzers, der durch eine Reihe bereitgestellter SSH-Schlüssel autorisiert ist und ohne Passwort sudo-Berechtigungen erhalten darf (Basisanforderung für automatisierte Bereitstellungen).

- include: "{{root_dir}}/use/__create_deploy_user.yml user={{deploy_user}} group={{deploy_user}} home=/home/{{deploy_user}}"
  when: deploy_user is defined

- name: SSH | Schlüssel autorisieren
  authorized_key: user={{deploy_user}} key="{{ lookup('file', item) }}"
  when: deploy_user_keys is defined
  with_items: "{{deploy_user_keys}}"
  sudo: ja

Sie können den Benutzer in Ihrem Playbook definieren, zum Beispiel so:

jenkins_benutzer: jenkins
jenkins_autorisierte_schlüssel:
  - "{{playbook_dir}}/components/files/ssh/vyacheslav.pub"

und später dies als Parameter an die Rolle übergeben:

rollen:
   - {
       rolle: "sa-box-bootstrap",
       root_verzeichnis: "{{playbook_dir}}/public/ansible_developer_recipes",
       bereitstellungs_benutzer: "{{jenkins_benutzer}}",
       autorisierte_schlüssel_benutzer: "{{jenkins_autorisierte_schlüssel}}"
     }

Schritt 3: SSH sichern (optional)

- name: SSH | Zwinge zur Sicherheit der SSH-Schlüssel
  lineinfile: dest=/etc/ssh/sshd_config regexp="{{item.regexp}}" line="{{item.line}}"
  with_items: "{{sshd_config_lines}}"
  when: option_enforce_ssh_keys_login
  become: true
  tags: ssh

Wenn die Variable option_enforce_ssh_keys_login auf true gesetzt ist, wird die SSHD-Konfiguration gemäß den Regeln in sshd_config_lines geändert. Standardmäßig verwendet es das Protokoll v2, verbietet Root-Logins und die Passwortauthentifizierung.

Schritt 4: Seltsame Personen sperren, die Ihr SSH-Benutzerzugang erraten

Wenn die Variable option_file2ban auf true gesetzt ist. Wird das spezielle Tool file2ban installiert. Es überwacht fehlgeschlagene SSH-Login-Versuche und sperrt Eindringlinge. Um zu verhindern, dass Sie versehentlich blockiert werden, ist es eine gute Idee, Ihre IPs auf die Genehmigungsliste zu setzen; sowohl einzelne IPs als auch Netzmasken werden unterstützt, zum Beispiel:

genehmigte_ips:
 - 127.0.0.1
 - 127.0.0.1/8

Erstellen Sie Ihr eigenes Box-Bootstrap-Projekt

Lassen Sie uns ein grundlegendes Bootstrap-Projekt vorbereiten, das in Zukunft verwendet werden kann. Es enthält folgende Dateien:

  • bootstrap.sh - installiert Ansible zusammen mit Abhängigkeiten.
  • init.sh - initialisiert
  • .projmodules - vollständig kompatibel mit der .gitmodules-Syntax von Git, spezifiziert die Liste der Abhängigkeiten, die vom Playbook verwendet werden, darunter Ansible - standardmäßig die Entwicklerrezepte (ein Repository mit praktischen Bereitstellungsrezepten) und die Ansible-Rolle sa-box-bootstrap, die für die Schritte zur Sicherung der Box verantwortlich ist.
[submodule "public/ansible_developer_recipes"]
    path = public/ansible_developer_recipes
    url = [email protected]:Voronenko/ansible_developer_recipes.git
[submodule "roles/sa-box-bootstrap"]
        path = roles/sa-box-bootstrap
        url = [email protected]:softasap/sa-box-bootstrap.git
  • hosts - listen Sie hier die ursprünglichen Box-Anmeldeinformationen auf, die Ihnen für den Server zur Verfügung gestellt wurden.
[bootstrap]
box_bootstrap ansible_ssh_host=192.168.0.17 ansible_ssh_user=your_user ansible_ssh_pass=your_password
  • box_vars.yml - legen Sie hier spezifische Umgebungsüberschreibungen fest, wie z.B. Ihren bevorzugten Bereitstellungsbenutzernamen und Schlüssel.
  • box_bootstrap.yml - hier fügen Sie Ihre Schritte zur Bereitstellung der Box hinzu. Die Sicherung der Box ist nur der erste Schritt. Um Parameter für sa-box-bootstrap zu überschreiben, übergeben Sie die Parameter wie im folgenden Beispiel.
- hosts: all

  vars_files:
    - ./box_vars.yml
  rollen:
     - {
         rolle: "sa-box-bootstrap",
         root_verzeichnis: "{{playbook_dir}}/public/ansible_developer_recipes",
         bereitstellungs_benutzer: "{{my_deploy_user}}",
         autorisierte_schlüssel_benutzer: "{{my_deploy_authorized_keys}}"
       }

Code in Aktion

Der Code kann aus dem Repository https://github.com/Voronenko/devops-bootstrap-box-template heruntergeladen werden. Um es zu verwenden - forken Sie es, passen Sie die Parameter an Ihre Bedürfnisse an und verwenden Sie es. Die Anpassung umfasst die Erstellung einer box_vars.yml-Datei. Dort können Sie jede der oben genannten Variablen überschreiben. Der minimal erforderliche Satz ist der Bereitstellungsbenutzer und Ihre öffentlichen Schlüssel.

box_deploy_user: jenkins
box_deploy_authorized_keys:
  - "{{playbook_dir}}/components/files/ssh/vyacheslav.pub"

Stellen Sie sicher, dass Sie Ansible haben (bootstrap.sh zum Installieren) und die Rollenverzeichnisse geklont haben (init.sh). Führen Sie dann setup.sh aus. Wenn alles korrekt konfiguriert ist, sehen Sie so etwas:

PLAY [all] ********************************************************************

FAKTEN SAMMELN ***************************************************************
ok: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Setzt korrekt den Hostnamen] ****************************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | debug var="ufw_rules_allow"] ************************
ok: [box_bootstrap] => {
    "var": {
        "ufw_rules_allow": [
            {
                "port": 80,
                "proto": "tcp"
            },
            {
                "port": 443,
                "proto": "tcp"
            },
            {
                "port": 22,
                "proto": "tcp"
            }
        ]
    }
}

AUFGABE: [sa-box-bootstrap | UFW | Setze es zurück] *************************************
ok: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | UFW | Konfiguriere eingehende/ausgehende Standards] *********
ok: [box_bootstrap] => (item={'policy': 'deny', 'direction': 'incoming'})
ok: [box_bootstrap] => (item={'policy': 'allow', 'direction': 'outgoing'})

AUFGABE: [sa-box-bootstrap | UFW | Konfiguriere Regeln zum Zulassen eingehender Verbindungen] ****
ok: [box_bootstrap] => (item={'port': 80, 'proto': 'tcp'})
ok: [box_bootstrap] => (item={'port': 443, 'proto': 'tcp'})
ok: [box_bootstrap] => (item={'port': 22, 'proto': 'tcp'})

AUFGABE: [sa-box-bootstrap | UFW | Konfiguriere Regeln zum Zulassen eingehender Verbindungen von bestimmten Hosts] ***
skipping: [box_bootstrap] => (item=ufw_rules_allow_from_hosts)

AUFGABE: [sa-box-bootstrap | UFW | Aktiviere es] ************************************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Monit | Überprüfe, ob es installiert ist] **********************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Monit | libssl-dev Abhängigkeit] **********************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Monit | Herunterladen] ***********************************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Monit | Installieren] ************************************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | debug msg="Erstelle Bereitstellungsbenutzer {{my_deploy_user}}:{{my_deploy_user}} mit Heimatverzeichnis /home/{{my_deploy_user}}"] ***
ok: [box_bootstrap] => {
    "msg": "Erstelle Bereitstellungsbenutzer jenkins:jenkins mit Heimatverzeichnis /home/jenkins"
}

AUFGABE: [sa-box-bootstrap | Bereitstellungsbenutzer | Gruppe erstellen] ***********************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Bereitstellungsbenutzer | Benutzer erstellen] ************************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Bereitstellungsbenutzer | Überprüfe Schlüsselvorhandenheit] *******************
ok: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Bereitstellungsbenutzer | Kopiere autorisierte Schlüssel von {{ansible_user_id}}] ***
skipping: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Bereitstellungsbenutzer | Setze Berechtigungen für autorisierte Schlüssel] ****
skipping: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Bereitstellungsbenutzer | Stelle sicher, dass sudoer keine Passwortaufforderung erhält] ****
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | SSH | Schlüssel autorisieren] *******************************
changed: [box_bootstrap] => (item=/home/slavko/labs/devops-bootstrap-box-template/components/files/ssh/vyacheslav.pub)

AUFGABE: [sa-box-bootstrap | SSH | Zwinge zur Sicherheit der SSH-Schlüssel] ********************
ok: [box_bootstrap] => (item={'regexp': '^Protocol.*', 'line': 'Protocol 2'})
changed: [box_bootstrap] => (item={'regexp': '^PermitRootLogin.*', 'line': 'PermitRootLogin no'})
ok: [box_bootstrap] => (item={'regexp': '^RSAAuthentication.*', 'line': 'RSAAuthentication yes'})
ok: [box_bootstrap] => (item={'regexp': '^PubkeyAuthentication.*', 'line': 'PubkeyAuthentication yes'})
ok: [box_bootstrap] => (item={'regexp': '^ChallengeResponseAuthentication.*', 'line': 'ChallengeResponseAuthentication no'})
changed: [box_bootstrap] => (item={'regexp': '^PasswordAuthentication.*', 'line': 'PasswordAuthentication no'})
changed: [box_bootstrap] => (item={'regexp': '^MaxAuthTries.*', 'line': 'MaxAuthTries 3'})

AUFGABE: [sa-box-bootstrap | SSH | Starte SSHD neu] *********************************
changed: [box_bootstrap]

AUFGABE: [sa-box-bootstrap | Installiere Basis-Ubuntu-Pakete] ***********************
changed: [box_bootstrap] => (item=unzip,mc)

SPIELZUSAMMENFASSUNG ********************************************************************
box_bootstrap              : ok=21   changed=13   unreachable=0    failed=0   

Schließlich haben Sie die gesicherte Box mit dem sudo-Bereitstellungsbenutzer, den Sie angegeben haben, der nur mit den von Ihnen festgelegten Schlüsseln autorisieren darf. Root darf sich nicht anmelden. Nur einige eingehende Ports sind gemäß Ihren Regeln erlaubt.

Überprüfen Sie mit NMap und versuchen Sie, sich einzuloggen:

ssh  192.168.0.17
Zugriff verweigert (öffentlicher Schlüssel).

ssh -ldeploy_user 192.168.0.17
Willkommen bei Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-32-generic x86_64)
deploy_user@LABBOX17:~$

Interessante Punkte

Sie können dieses Playbook wiederverwenden, um Ihre eigenen Box-Bootstrapping-Projekte zu erstellen und die Rolle zu verwenden, um Ihre Umgebungen schneller und sicherer mit Ansible zu konfigurieren.

Über das Projekt

Role to perform basic securing of fresh instance for further automated deploy

Installieren
ansible-galaxy install softasap.sa_box_bootstap
GitHub Repository
Lizenz
Unknown
Downloads
1.7k
Besitzer
Get your application deployed in a robust way