MinIO Community Edition Object Storage auf Ubuntu installieren

Hier ist eine Schritt-für-Schritt Anleitung zur Installation und Konfiguration von MinIO Community Edition auf einem Ubuntu-Server 22.04.

Szenario

Wenn eine Open-Source-Software plötzlich kommerziell wird, ändert sich oft einiges. Aktuell fehlen in der MinIO Community Edition sämtliche gängige Admin-Funktionen in der Web-Konsole. Diese Funktionalität ist nicht verschwunden, sondern nur noch über das Kommandozeilen-Tool mc erreichbar.

Diese Anleitung zeigt anhand einer Lab-Umgebung, wie MinIO mit TLS installiert wird, wie bucket-spezifische Zugriffsrechte eingerichtet werden und wie diese am Beispiel eines externen Clients (rclone) genutzt werden können. Die Testumgebung besteht aus drei Komponenten:

  • einem Windows Server mit Active Directory und interner Zertifizierungsstelle (CA)
  • einem Ubuntu 22.04 Server für MinIO
  • und einem Windows-Client für den externen Zugriff per rclone.

Das Ziel ist es, einen Benutzer anzulegen, der ausschließlich auf einen bestimmten Bucket über ein eigenes Access Key Paar (Token) zugreifen kann.

Installation- und Konfiguration-Schritte

  • Ubuntu 22.04 Installation
  • System Update
  • MinIO Server installieren
  • Benutzer und Verzeichnisse anlegen
  • DNS-Eintrag anlegen
  • TLS-Schlüssel und CSR erzeugen
  • Zertifikat in Windows CA erstellen
  • Zertifikat für MinIO installieren
  • Systemd-Service konfigurieren
  • MinIO starten
  • MinIO Client (mc) installieren
  • Testen

1. Ubuntu 22.04 Installation.

IP: 192.168.1.120

2. System Update.

Das Linux System wird auf den aktuellen Stand gebracht.

sudo apt update && sudo apt upgrade -y

3. MinIO Server installieren.

Das MinIO-Binary wird heruntergeladen. Die Datei wird ausführbar gemacht und in den Ordner /usr/local/bin/ verschoben.

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

⚠️ Die installierte Version ist RELEASE.2025-09-07T16-13-09Z. Das ist die letzte MinIO Community Edition Version  vor der Archivierung. (s. Fazit)

4. Benutzer und Verzeichnisse anlegen

Für den MinIO-Dienst werden ein eigener Systembenutzer und ein Datenverzeichnis erstellt. Da Linux bei useradd -r automatisch eine gleichnamige Gruppe anlegt, heißen User und Group absichtlich gleich.

sudo useradd -r -s /sbin/nologin minio-user
sudo mkdir -p /opt/minio/data
sudo chown -R minio-user:minio-user /opt/minio

Alles was man über Buckets hochgeladen wird, landet unter /opt/minio/data/. MinIO legt dort pro Bucket ein Unterverzeichnis an, z.B.: /opt/minio/data/projekt-bonn

Für eine Labor-Umgebung ist das völlig in Ordnung. In einer produktiven Umgebung würde man dagegen typischerweise ein eigenes Volume mounten, um die Daten vom Betriebssystem zu trennen.

5. DNS-Eintrag anlegen

Auf dem Domain Controller (DNS) wird ein A-Record für den MinIO-Server erstellt, damit das Zertifikat später zum Hostnamen passt: minio.demo.lab – 192.168.1.120

6. TLS-Schlüssel und CSR erzeugen

Der private Schlüssel und ein Certificate Signing Request (CSR) werden auf dem MinIO-Server erzeugt.

openssl genrsa -out private.key 4096

CSR mit SAN erzeugen. Das SAN-Feld ist wichtig, da moderne Browser den CN ignorieren können.

openssl req -new -key private.key -out minio.csr \
-addext "subjectAltName = DNS:minio.demo.lab"

7. CSR bei der Windows CA einreichen

Der CSR wird über die Web-Oberfläche der Windows CA hochgeladen und als Zertifikat ausgestellt. CSR-Inhalt anzeigen:

cat minio.csr

Und die Inhalte kopieren (sieht etwa so aus):

-----BEGINN DER ZERTIFIKATSANFRAGE----- 
MIIE1jCCAr4CAQAwZTELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05... 
-----ENDE DER ZERTIFIKATSANFRAGE-----
  • Web-Oberfläche aufrufen: https://dc.demo.lab/certsrv/
  • Request a certificate
  • advanced certificate request
  • CSR-Inhalt eintragen
  • Template auswählen: „Web Server“
  • „Submit“
  • Zertifikat herunterladen: Base 64 encoded
  • “Download certificate”

Das Zertifikat mit dem Namen „certnew.crt” (auf der Windows-CA) muss nun auf die MinIO-VM kopiert werden.

Root-CA-Zertifikat der Windows CA ablegen. 

Das Root-Zertifikat der Windows-CA kann unter https://dc.demo.lab/certsrv/ heruntergeladen und in denselben Ordner wie die anderen Zertifikate kopiert werden.

8. Zertifikat für MinIO installieren

Das ausgestellte Zertifikat und der Schlüssel werden im richtigen Format und mit den richtigen Berechtigungen abgelegt.

8.1. Zertifikat umbenennen, da MinIO public.crt und private.key erwartet.

mv certnew.crt public.crt

8.2. Zertifikatsverzeichnis erstellen:

sudo mkdir -p /etc/minio/certs
sudo mkdir -p /etc/minio/certs/CAs

8.3. Zertifikat-Dateien kopieren:

sudo cp public.crt /etc/minio/certs/public.crt
sudo cp private.key /etc/minio/certs/private.key

8.4. Root-CA-Zertifikat der Windows CA kopieren:

sudo cp DEMO-DC-CA.crt /etc/minio/certs/CAs/ca-root.crt

8.5. Eigentümer und Berechtigungen setzen:

sudo chown -R minio-user:minio-user /etc/minio/certs
sudo chmod 600 /etc/minio/certs/private.key
sudo chmod 644 /etc/minio/certs/public.crt
sudo chmod 644 /etc/minio/certs/CAs/ca-root.crt

9. Systemd-Service konfigurieren

Die Service-Datei steuert den automatischen Start sowie die Laufzeitparameter.

sudo nano /etc/systemd/system/minio.service

Inhalt der Service-Datei:

[Unit]
Description=MinIO Object Storage
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
ExecStart=/usr/local/bin/minio server /opt/minio/data \
--console-address ":9001" \
--address ":9000" \
--certs-dir /etc/minio/certs

Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=Test12345!"
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

10. MinIO starten

Mit unteren Befehlen wird der Dienst aktiviert und gestartet.

sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio
sudo systemctl status minio

Die Web-Konsole ist danach unter https://minio.demo.lab:9001 erreichbar.

11. MinIO Client (mc) installieren

Der mc-Client ist das Administrationswerkzeug, da die Web-Konsole der Community Edition keine Admin-Funktionen bietet. Der Funktionsumfang der Web-Konsole der Community Edition ist echt bescheiden. Über die Web-Konsole der Community Edition können Buckets erstellt, Dateien hoch- bzw. heruntergeladen und im Object Browser navigiert werden. Was man nicht kann:

  • Benutzer anlegen
  • Policies erstellen und zuweisen
  • Access Keys/Service Accounts verwalten
  • Server-Monitoring einsehen usw.

All das ist nur über mc möglich.

Das mc-Binary wird heruntergeladen. Die Datei wird ausführbar gemacht und in den Ordner /usr/local/bin/ verschoben.

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

Mit dem unteren Befehl wird eine Verbindung zum installierten MinIO-Server unter dem Kurznamen „myminio” gespeichert. Danach muss man nicht jedes Mal die vollständige URL und die Anmeldedaten eingeben, sondern kann einfach „myminio” als Namen verwenden.

mc alias set myminio https://minio.demo.lab:9000 admin Test12345!

Falls bei Ihnen auch diese Fehlermeldung kommt „certificate signed by unknown authority“ bedeutet es, dass der mc-Client das Root-CA-Zertifikat der CA nicht kennt.

Hier ist eine Lösung dazu. Das CA-Zertifikat systemweit hinterlegen:

sudo cp /etc/minio/certs/CAs/ca-root.crt /usr/local/share/ca-certificates/demo-lab-ca.crt
sudo update-ca-certificates

Oft wird „–insecure” als eine Lösung für solche Meldungen angegeben. Damit wird die TLS-Zertifikatsprüfung komplett übersprungen und der Fehler „certificate signed by unknown authority” nicht auftaucht. Der Client verbindet sich zwar verschlüsselt, prüft aber nicht, ob das Zertifikat gültig und vertrauenswürdig ist, und das bringt ein Sicherheitsrisiko wie Man-in-the-Middle-Angriffe mit sich. Für einen Lab wäre diese „Abkürzung“ noch ok, aber nicht für eine produktive Umgebung.

Test durchfüren

12. Test-Buckets erstellen

Zwei Buckets werden angelegt, um später die Zugriffskontrolle gezielt testen zu können.

mc mb myminio/projekt-bonn
mc mb myminio/projekt-koeln

13. Bucket-Policy erstellen

Die untere Policy wird den Zugriff auf einen bestimmten Bucket (in unserem Fall projekt-bonn) beschränken und wird einem neuen Benutzer zugewiesen.

Policy-Datei erstellen (projekt-bonn-policy.json):

{

  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:*"],
    "Resource": [
      "arn:aws:s3:::projekt-bonn",
      "arn:aws:s3:::projekt-bonn/*"
    ]
  }]
}

Hier ist die Erklärung der IAM-Policy (Identity and Access Management):

-----
"Effect": "Allow" - erlaube die folgenden Aktionen (das Gegenteil wäre "Deny").

-----
"Action": ["s3:*"], - das Sternchen (*) ist ein Platzhalter (Wildcard) für Alles, also alle S3-Operationen: Lesen, Schreiben, Löschen, Auflisten.

-----
"Resource": [
      "arn:aws:s3:::projekt-bonn",
      "arn:aws:s3:::projekt-bonn/*"
    ]
"arn:aws:s3:::projekt-bonn" - Die erste Zeile erlaubt Operationen auf dem Bucket selbst. Das erlaubt dem User z. B. zu prüfen, ob der Bucket existiert oder welche Einstellungen er hat.

"arn:aws:s3:::projekt-bonn/*" - Das Sternchen am Ende bezieht sich auf alle Objekte innerhalb des Buckets. Ohne diese Zeile könnte der User zwar den Bucket „sehen”, aber keine Dateien darin lesen oder hochladen.

14. Eingeschränkten Benutzer anlegen

14.1. Diese Befehlskette erstellt ein admin in meinem MinIO-Server mit dem Alias myminio ein Regelwerk auf Basis von projekt-bonn-policy.json

mc admin policy create myminio projekt-bonn-only projekt-bonn-policy.json

Erwartetes Ergebnis:

Created policy `projekt-bonn-only` successfully.

14.2. Ein neues Konto bonn-user wird erstellt. Der User kann sich zwar anmelden, hat aber noch gar keine Rechte und sieht keine Buckets.

mc admin user add myminio bonn-user Test1234

Erwartetes Ergebnis:

Added user `bonn-user` successfully.

14.3. Hier wird die Policy aus dem ersten Schritt mit dem User bonn-user verknüpft. Der User darf alles tun, was in der Policy projekt-bonn-only definiert ist und die verweist auf den Bucket projekt-bonn. Also darf bonn-user alles im Bucket projekt-bonn, nicht in der Policy selbst. Die Policy ist nur das Regelwerk, der Bucket ist das Ziel.

mc admin policy attach myminio projekt-bonn-only --user bonn-user

Erwartetes Ergebnis:

Attached Policies: [projekt-bonn-only]
To User: bonn-user

15. Zugriffskontrolle testen

Mit dem eingeschränkten Benutzer bonn-user wird geprüft, ob der Zugriff auf den erlaubten Bucket funktioniert und auf andere Buckets blockiert wird.

mc alias set testaccount https://minio.demo.lab:9000 bonn-user Test1234

Erwartetes Ergebnis:

Added `testaccount` successfully.

Die Inhalte von Bucket projekt-bonn auflisten. Da keine Inhalte vorhanden sind, gibt es auch keine Ergebnisse.

mc ls testaccount/projekt-bonn

Eine Textdatei in das Bucket kopieren:

mc cp testdatei.txt testaccount/projekt-bonn/

Erwartetes Ergebnis:

.../minio/testdatei.txt: 17 B / 17 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 993 B/s 0s

Die Inhalte von Bucket projekt-koeln auflisten.

mc ls testaccount/projekt-koeln

Erwartetes Ergebnis:

mc: <ERROR> Unable to list folder. Access Denied.

Eine Textdatei in das Bucket kopieren:

mc cp testdatei.txt testaccount/projekt-koeln/

Erwartetes Ergebnis:

mc: <ERROR> Failed to copy `/home/minio/testdatei.txt`. Insufficient permissions to access this path `https://minio.demo.lab:9000/projekt-koeln/testdatei.txt`

Service Accounts für die Bucket-Kommunikation

Um die Kommunikation zwischen Buckets und den Zielsystemen, die diese Buckets als Speicherort verwenden, zu ermöglichen, wäre es sinnvoll, Service-Accounts anzulegen. Ein Service-Account besteht aus zwei Teilen:

  • einer Access Key ID, die wie ein Benutzername wirkt,
  • und einem Secret Key, der das zugehörige Passwort ist.

Über eine Policy kann dieses Key-Paar auf einen bestimmten Bucket eingeschränkt werden.

In der Enterprise-Konsole lassen sich Service-Accounts per Klick erstellen. In der Community Edition geht das über folgenden Befehl:

mc admin accesskey create myminio bonn-user --policy projekt-bonn-policy.json

oder auch (alte Syntax):

mc admin user svcacct add myminio bonn-user --policy projekt-bonn-policy.json

user svcacct add und accesskey create sind identische Befehle — beide erstellen einen technischen Unter-Account (ein „Token“). Der erste ist die alte Syntax, der zweite die aktuelle. Beide funktionieren weiterhin.

myminio — der Alias für die Verbindung zum Server.

bonn-user — der übergeordnete Benutzer. Der Service Account gehört zu diesem User. Ohne –policy würde er alle Rechte des Eltern-Users erben — kann aber nie mehr Rechte haben, sondern nur weniger.

–policy projekt-bonn-policy.json — damit wird dem Token sofort eine Einschränkung mitgegeben. Selbst wenn bonn-user nachträglich Admin-Rechte bekommen würde, dürfte dieser Service Account nur das, was in der JSON-Datei steht.

Erwartetes Ergebnis bei aktueller Syntax:

Access Key: 2G1AFOQS8SERWSCOS3SY
Secret Key: 0jvRA+BakWerBpULu7HmvKVRkmwz9OZfE5cQqgBQ
Expiration: NONE

Erwartetes Ergebnis bei alter Syntax (funktioniert weiterhin als Alias)::

Access Key: 4AOH98NO6QI2W4LN0P8I
Secret Key: ltoU8KrN+17B2mGIBt+ytNoaELUNa5iawr2+7DEQ
Expiration: no-expiry

Auch wenn die Ergebnisse unterschiedlich sind, funktionieren beide Token weiterhin. Mit diesem Befehl lassen sich die vorhandenen Keys anzeigen:

mc admin accesskey ls myminio bonn-user

Erwartetes Ergebnis:

User: bonn-user
  Access Keys:
    4AOH98NO6QI2W4LN0P8I, expires: never, sts: false
    2G1AFOQS8SERWSCOS3SY, expires: never, sts: false

So konnte man den nicht mehr benötigten Key löschen:

mc admin accesskey rm myminio <Key-ID>

Offizielle Doku: mc admin accesskey

Ein Gegencheck mit rclone

Unser Test wäre nicht vollständig, wenn wir nicht versuchen würden, unsere Buckets von einem externen System mithilfe einen weiten Client zu testen.

rclone – Installation

rclone benötigt keine Installation und ist direkt nach dem Entpacken nutzbar.

rclone – Konfiguration

Die Konfiguration startet einen Wizard, der anschließend eine Konfigurationsdatei generiert. So lässt sich der Wizard starten:  .\rclone.exe config Die Konfigurationsfragen des Wizards sind selbsterklärend und benötigen keine besondere Dokumentation.

Um Ihnen Zeit zu sparen, können Sie meine Konfigurationsdatei direkt verwenden. Diese wird auf dem Windows-System unter dem Pfad abgelegt:

C:\Users\<UserName>\AppData\Roaming\rclone\rclone.conf

[myminio]
type = s3
provider = Minio
access_key_id = 2G1AFOQS8SERWSCOS3SY
secret_access_key = 0jvRA+BakWerBpULu7HmvKVRkmwz9OZfE5cQqgBQ
endpoint = https://minio.demo.lab:9000
acl = private

Nach Erstellung der Konfigurationsdatei ist rclone sofort einsatzbereit.

Dateien im Bucket auflisten:

.\rclone.exe ls myminio:projekt-bonn
# oder sehr detaillierte Ausgabe:

.\rclone.exe ls myminio:projekt-bonn -vv --contimeout 10s

Erwartetes Ergebnis:

2026/03/14 12:22:49 DEBUG : rclone: Version "v1.73.2" starting with parameters [".\\rclone.exe" "ls" "myminio:projekt-bonn" "-vv" "--contimeout" "10s"]
2026/03/14 12:22:49 DEBUG : Creating backend with remote "myminio:projekt-bonn"
2026/03/14 12:22:49 DEBUG : Using config file from "C:\\Users\\Administrator\\AppData\\Roaming\\rclone\\rclone.conf"
17 testdatei.txt
2026/03/14 12:22:49 DEBUG : 4 go routines active

-vv steht für „Very Verbose“, jeden einzelnen Schritt wird geloggt.

–contimeout 10s (Connection Timeout) – dieser Parameter setzt ein Zeitlimit für den Verbindungsaufbau.

So lässt sich beispielsweise die Datei in das Bucket hochladen:

.\rclone.exe copy c:\Temp\rclone-v1.73.2-windows.zip myminio:projekt-bonn/

So aus dem Bucket heruntladen:

.\rclone.exe copy myminio:projekt-bonn/testdatei.txt C:\Downloads\

Fazit

Ja, die MinIO Community Edition ist tot…

Die MinIO Community Edition wurde am 13. Februar 2026 archiviert und ist jetzt schreibgeschützt. Auf GitHub hat das Repository den Status „THIS REPOSITORY IS NO LONGER MAINTAINED.“ Das bedeutet konkret, dass es nicht nur keine neuen Features, sondern auch keine garantierten Sicherheitsupdates mehr geben wird.

Für mein aktuelles Lernprojekt ist das kein Problem. Die Installation läuft, die Konzepte (Buckets, Policies, Access Keys, S3-Protokoll) sind identisch, egal ob Community oder AIStor. Somit ist das Wissen übertragbar.

Aber keine Sorgen, die Alternativen werden getestet. Weiter geht es mit der Aktualisierung auf AIStor…  Forstsetzung…