Kategorien
Docker

Mehrere Befehle mit docker ausführen

Es gibt mehrere Möglichkeiten, mehrere Befehle mit Docker Compose auszuführen. Hier sind ein paar Beispiele:

  1. Verwenden Sie das && Zeichen, um mehrere Befehle in einer einzigen Zeile auszuführen:
docker-compose exec <service-name> <command1> &amp;&amp; <command2> &amp;&amp; <command3>
  1. Verwenden Sie ein Semikolon, um mehrere Befehle in einer einzigen Zeile auszuführen
docker-compose exec <service-name> <command1>; <command2>; <command3>
  1. Erstellen Sie eine Bash-Skript-Datei mit mehreren Befehlen und führen Sie die Datei mit dem Befehl sh aus:
docker-compose exec <service-name> sh <script-file>
  1. Verwenden Sie eine Bash-Eingabeaufforderung, um mehrere Befehle auszuführen.




Nachdem Sie sich in die Bash-Eingabeaufforderung eingeloggt haben, können Sie mehrere Befehle eingeben und ausführen.

Wenn Sie sich mit einem bestimmten Benutzer anmelden möchten und mehrere Befehle ausführen möchten, können Sie auch den Befehl su verwenden, um den Benutzer zu wechseln, bevor Sie die Befehle ausführen, so wie ich es in meiner vorherigen Antwort erwähnt habe.

docker-compose exec <service-name> su -c "<command1> &amp;&amp; <command2> &amp;&amp; <command3>" <username>

Wichtig ist dass, je nachdem welche Art von Befehlen Sie ausführen, bestimmte Bedingungen erfüllt sein müssen und es auch darauf ankommt ob diese Befehle in einer einzigen Zeile oder in mehreren Zeilen ausgeführt werden sollen.

Kategorien
Docker

Verbinden mit einem Docker Container unter einem bestimmten User

Um sich mit einem bestimmten Benutzer in einen Docker-Container zu verbinden, können Sie den Befehl docker exec verwenden. Der Befehl hat folgendes Format:

docker exec -it [container_name_or_id] [command]

Der Parameter -i sorgt dafür, dass die Standardeingabe (stdin) an die angegebene Befehlszeile gebunden wird, während der Parameter -t dafür sorgt, dass ein pseudo-Terminal erstellt wird. Der container_name_or_id entspricht der ID oder dem Namen des Containers, mit dem Sie sich verbinden möchten. Der command ist der Befehl, den Sie ausführen möchten, wenn Sie sich mit dem Container verbunden haben.

Um sich beispielsweise mit dem Benutzer „testuser“ in einen Container mit dem Namen „mycontainer“ zu verbinden und eine Bash-Sitzung zu starten, würden Sie den folgenden Befehl verwenden:

docker exec -it mycontainer bash -c 'su - testuser'

Beachten Sie, dass Sie nur dann in einen Container als bestimmter Benutzer verbinden können, wenn der Benutzer auch tatsächlich in dem Container vorhanden ist.

Verwendung von docker-compose

Wenn Sie Docker Compose verwenden, können Sie den Befehl docker-compose exec verwenden, um sich mit einem bestimmten Benutzer in einen Container zu verbinden. Der Befehl hat folgendes Format:

Der service_name ist der Name des Dienstes, der in der Compose-Datei definiert ist, mit dem Sie sich verbinden möchten. Der command ist der Befehl, den Sie ausführen möchten, wenn Sie sich mit dem Container verbunden haben.

Um beispielsweise mit dem Benutzer „testuser“ in einen Dienst mit dem Namen „web“ zu verbinden und eine Bash-Sitzung zu starten, würden Sie den folgenden Befehl verwenden:

docker-compose exec web bash -c 'su - testuser'

Wie bereits erwähnt, beachten Sie, dass Sie nur dann in einen Container als bestimmter Benutzer verbinden können, wenn der Benutzer auch tatsächlich in dem Container vorhanden ist.

Kategorien
Docker Symfony

SSO Saml Login mit Symfony

Single-Sign-On ist das Thema der Stunde, es verbessert die Sicherheit und auch die User Verwaltung. Um Saml SSO in Symfony einzubauen gibt es das OneloginSaml Bundle, ein Symfony Wrapper für das php-saml Packet.

Der Vorteil für die Benutzer von SSO liegt darin, dass diese sich morgens einmal authentifizieren müssen und danach den ganzen Tag alle Anwendungen verwenden können ohne sich nochmals einloggen zu müssen.

Der Vorteil für das Unternehmen liegt darin, dass es vorgeben kann, dass die Authentifierung nur mit 2 Faktor Authentifizierung stattfinden kann (z.B. Handy App und Passwort), um mehr Sicherheit zu gewährleisten. Dies kannn in der Zukunft den steigendenden Sicherheitsbedürfnissen angepasst werden. Außerdem können zentral Rechte vergeben werden für User und nach dem Austritt aus dem Unternehmen einfach wieder entzogen werden.

Wenn das Bundle installiert und korrekt konfiguriert ist, benötigt man eine Dev-Umgebung mit einem Identity Provider (IdP). Dafür bietet sich docker-simplesamlphp an:

docker-compose.yml:

version: '3.7'
services:
	idp:
		image: kenchan0130/simplesamlphp
		container_name: idp
		ports:
			- "8080:8080"
		environment:
			SIMPLESAMLPHP_SP_ENTITY_ID: http://localhost/saml/metadata
			SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE: http://localhost/saml/acs
			SIMPLESAMLPHP_SP_SINGLE_LOGOUT_SERVICE: http://localhost/saml/logout

Das OneloginSaml Bundle muss folgender Maßen konfiguriert werden:

hslavich_onelogin_saml:
  # Basic settings
  idp:
    # Identifier of the SP entity  (must be a URI)
    entityId: 'http://localhost:8080/simplesaml/saml2/idp/metadata.php'
    singleSignOnService:
      url: 'http://localhost:8080/simplesaml/saml2/idp/SSOService.php'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
    singleLogoutService:
      url: 'http://localhost:8080/simplesaml/saml2/idp/SingleLogoutService.php'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
    x509cert: 'insert certificate here'
  # Service Provider Data that we are deploying.
  sp:
    entityId: 'http://localhost/saml/metadata'
    assertionConsumerService:
      url: 'http://localhost/saml/acs'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
    singleLogoutService:
      url: 'http://localhost/saml/logout'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
    privateKey: ''

Die Informationen kann man hier ablesen, auch die vom Zertifikat:

SAML Metadata: http://localhost:8080/simplesaml/saml2/idp/metadata.php?output=xhtml

Wenn man alles richtig konfiguriert hat, dann landet man beim Aufruf der Symfony Anwendung auf der Login Seite des IdP Providers und kann sich dort einloggen:

Login Seite des IdP Providers

Die Logins lauten:

admin:     secret
user1:     password
user2:     password

Dann sollte man sich mit seiner Symfony Applikation lokal über SAML einloggen und testen können.

Kategorien
Amazon AWS

AWS API Gateway für DynamoDB erstellen

Die Aufgabe ist es eine REST API zu erstellen mit AWS API Gateway, welche Daten lesen und später auch schreiben kann von einer Dynamo DB ohne eine Lambda Funktion zu verwenden.

Wir werden das API Gateway so konfigurieren, dass es die Request Daten validiert und so verändert, dass der DynamoDB Service die Daten verarbeitet.

Dazu erstellen wir in AWS ein nicht private REST API:

REST API Gateway erstellen
DynamoDB NoSql Datenbank erstellen

Berechtigungen vergeben, dass das API Gateway auf die DynamoDB Tabelle zugreifen kann in AWS IAM. Dafür erstellen wir eine Richtlinie in IAM. Die Berechtigung sieht wie folgt aus:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "dynamodb:Scan"
      ],
      "Effect": "Allow",
      "Resource": "ENTER_ARN_OF_YOUR_DYNAMO_DB_HERE"
    }
  ]
}

Die Richtlinie kann mit dem Tool genriert werden: https://awspolicygen.s3.amazonaws.com/policygen.html

Dann muss eine Rolle mit der Richtlinie für den Service API Gateway erstellt werden in IAM. Hinweis: Die Richtlinie kann erst nach dem erstellen der Rolle hinzugefügt werden.

IAM Rolle für das API Gateway mit der erstellten Richtlinie

Dann Erstellen wir in AWS API Gateway eine Resource mit der Richtlinie:

Jetzt wandeln wir den einfacher GET Request /data/all mit leerem Payload um zu einem DynamoDB POST Request, der alle Daten zurückliefert, beschrieben in: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

Die Integrationsanforderung der Resource muss folger Maßen konfiguriert sein:

Weiterleiten des Requests an Dynamo DB als POST Scan Request

Der Request kann über den Testen Button in AWS ausprobiert werden:

Erfolgreicher Test des Endpunktes
Kategorien
Amazon AWS

AWS Policy Generator

Zum generieren von Berechtigungen gibt eine einfaches Web-Tool von AWS, welches einem die Berechtigungen im JSON Format generiert.

Type of policy ist meist IAM policy.

https://awspolicygen.s3.amazonaws.com/policygen.html

Kategorien
Amazon AWS

APIs erstellen mit AWS API Gateway

Amazon API Gateway ist eine Service mit dem man professionelle APIs erstellen kann, welche

  • skalieren
  • sich um die Authentifizierung kümmern
  • serverless sein können zu AWS Labmda oder einem AWS Datern Speicher
  • aber auch über HTTP(S) zu einer EC2 Instanz weiterleiten können
mögliche verbindbare serverless Services
serverless Datenbank Funktionalität
serverless Website Hosting

Das AWS API Gateway kann den Request validieren, verändern und auch beantworten/abbrechen um Traffic zu sparen.

Zur Authentifizierung können verschiedene Methoden verwendet werden über JWT Token, Basic Auth, Custom HTTP URLs und eigene Lambda Funktion.

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html

AWS Cognito zur Authentifizierung und User Management

Man kann aus der Schnittstelle ein SDK generieren, welches die Client zur Integration verwenden können und die Authentifizierung erleichtern. Derzeit werden unterstützt:

  • Java
  • Android
  • iOS
  • JavaScript
  • Ruby

https://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/how-to-generate-sdk-console.html

Erstellen eines SDK für Clients zum einbinden der Schnittstelle

Alles Requests/Responses können gelogt werden und analysiert werden in AWS CloudWatch.

Die CORS Regeln können damit verwaltet werden.

Die API lässt sich mit Hilfe von Open API/Swagger 3.0 definieren.

Es können neben REST/HTTP auch Websocket APIs erstellt werden.

Canary Release Möglichkeit: Es werden nur 10% der Requests auf den neu releasten Endpunkt, um zu schauen, ob soweit alles funktioniert:

https://docs.aws.amazon.com/apigateway/latest/developerguide/canary-release.html

Preis-Übersicht:

https://aws.amazon.com/de/api-gateway/pricing/

Empfohlene Videos:

Kategorien
Docker

Docker Windows Port freigeben

Wenn man in Docker unter Windows die Fehlermeldung bekommt:

Error response from daemon: Ports are not available: listen tcp 0.0.0.0:12345: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

Dann muss der Port 12345 freigeben werden:

Dazu muss man auf der Powsershell Konsole mit Admin Rechten erstmal checken, welche Ports schon freiegeben wurden:

netsh interface ipv4 show excludedportrange protocol=tcp

Wenn der Port in den Port Ranges nicht vorhanden ist, kann er folgender Maßen hinzugefügt werden:
  1. Hyper-V ausschalten (und PC neustarten danach)

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

2.Port hinzufügen:

netsh int ipv4 add excludedportrange protocol=tcp startport=12345 numberofports=1

3. Hyper-V wieder aktivieren (und PC neustarten danach)

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

Kategorien
Amazon AWS

FFmpeg installieren auf Amazon Linux 2

Mit folgenden Befehlen kann man ffmpeg unter Amazon Linux 2 installieren:

sudo su
curl -o /tmp/ffmpeg.tar.xz https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.2.2-amd64-static.tar.xz
tar -xvf /tmp/ffmpeg.tar.xz -C /usr/local/bin
ln -s /usr/local/bin/ffmpeg-4.2.2-amd64-static/ffmpeg /usr/bin/ffmpeg
ln -s /usr/local/bin/ffmpeg-4.2.2-amd64-static/ffprobe /usr/bin/ffprobe
Kategorien
Amazon AWS WordPress

WordPress Bitnami Banner entfernen auf AWS AMI

Um den Bitnami Banner entfernen zu können, soll man per SSH einen Konsolenbefehl ausführen:

sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1

dies führte bei mir zu einer Fehlermeldung, dass die Datei bnconfig nicht vorhanden ist:

sudo: /opt/bitnami/apps/wordpress/bnconfig: command not found

Die Ursache ist, dass die Datei standradmäßig erst deaktiviert ist, es gibt eine /opt/bitnami/apps/wordpress/bnconfig.disabled

Diese muss aktiviert werden, indem sie umbenannt wird nach bnconfig:

sudo mv /opt/bitnami/apps/wordpress/bnconfig.disabled /opt/bitnami/apps/wordpress/bnconfig

Danach kann der Banner erfolgreich entfernt werden:

sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1
Kategorien
Jenkins

Jenkins mit selbst signiertem SSL Zertifikat absichern

Damit Jenkins unter Linux nur noch über HTTPS erreichbar ist, muss man sich zuerst ein SSL Zertifikat erzeugen am besten im Ordner:

mkdir /var/lib/jenkins/ssl_cert/
cd /var/lib/jenkins/ssl_cert/

openssl req -newkey rsa:2048 -x509 -keyout cakey.pem -out cacert.pem -days 3650

Dann kann man dieses Zertifikat umwandeln für den Java Key Store:

openssl pkcs12 -export -in cacert.pem -inkey cakey.pem -out identity.p12 -name jenkins
keytool -importkeystore -destkeystore identity.jks  -srckeystore identity.p12 -srcstoretype PKCS12

und in den Java Key Store importieren:

keytool -import -file cacert.pem -keystore trust.jks

Am Ende muss nur noch die Config angepasst werden:

sudo vi /etc/sysconfig/jenkins

mit den Werten:

JENKINS_PORT="-1"

JENKINS_HTTPS_PORT="8443"

JENKINS_HTTPS_KEYSTORE="/var/lib/jenkins/ssl_cert/identity.jks"

JENKINS_HTTPS_KEYSTORE_PASSWORD="YOUR_PASSWORD_HERE"

JENKINS_HTTPS_LISTEN_ADDRESS="0.0.0.0"

Und der Service neu gestartet werden:

chown -R jenkins: /var/lib/jenkins/ssl_cert/*
chmod 600 /var/lib/jenkins/ssl_cert/*

sudo systemctl restart jenkins