Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
redhat:database-redhat:start [2017/09/13 17:06] – [Härten der Mariadb Datenban (Security relevant!)] michaelredhat:database-redhat:start [2019/03/08 13:22] (current) – [mysqladmin] michael
Line 4: Line 4:
 MariaDB löste mit RHEL7 / CentOS7 die bis dahin verwendete MySQL-Datenbank ab. Nachfolgend wird aufgezeit, wie man die Mariadb korrekt auf seinem System implementiert / härtet. MariaDB löste mit RHEL7 / CentOS7 die bis dahin verwendete MySQL-Datenbank ab. Nachfolgend wird aufgezeit, wie man die Mariadb korrekt auf seinem System implementiert / härtet.
  
- 
----- 
  
 ===== Installation MariaDB ===== ===== Installation MariaDB =====
Line 61: Line 59:
 </WRAP> </WRAP>
  
----- 
  
 ===== Konfiguration MariaDB ===== ===== Konfiguration MariaDB =====
Line 128: Line 125:
 </code> </code>
  
-<sxh bash; gutter: false>+<sxh plain; gutter: false>
 150307 22:10:14 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql/data 150307 22:10:14 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql/data
 150307 22:10:14 InnoDB: The InnoDB memory heap is disabled 150307 22:10:14 InnoDB: The InnoDB memory heap is disabled
Line 182: Line 179:
 </WRAP> </WRAP>
  
-Möchten wir überprüfen, ob der MariaDB-Server läuft, haben wir mehrere Möglichkeiten. +<panel type="info" title="Möchten wir überprüfen, ob der MariaDB-Server läuft, haben wir mehrere Möglichkeiten."> 
-  - **systemctl** <code># systemctl status mariadb -l</code><WRAP center round box 100%><sxh bash; gutter: false>mariadb.service - MariaDB database server+  - Daemon Überprüfung mit **systemctl**: <WRAP center box 100%><code># systemctl status mariadb -l</code><sxh plain; gutter: false>mariadb.service - MariaDB database server
    Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)    Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)
    Active: active (running) since Sat 2015-03-07 22:10:17 CET; 27min ago    Active: active (running) since Sat 2015-03-07 22:10:17 CET; 27min ago
Line 192: Line 189:
            ├─27039 /bin/sh /usr/bin/mysqld_safe --basedir=/usr            ├─27039 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
            └─27198 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql/data --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock</sxh></WRAP>            └─27198 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql/data --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock</sxh></WRAP>
-  - **ps** <code># ps aux | grep mysql</code><WRAP center round box 100%><sxh bash; gutter: false>mysql    27039  0.0  0.1 115344  1620 ?        Ss   22:10   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr+  - Prozess Überprüfung mit **ps**: <WRAP center box 100%><code># ps aux | grep mariadb</code><sxh bash; gutter: false>mysql    27039  0.0  0.1 115344  1620 ?        Ss   22:10   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
 mysql    27198  0.0  8.3 905348 84784 ?        Sl   22:10   0:01 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql/data --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock mysql    27198  0.0  8.3 905348 84784 ?        Sl   22:10   0:01 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql/data --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
 root     27302  0.0  0.0 112640   924 pts/0    R+   22:41   0:00 grep --color=auto mysql</sxh></WRAP> root     27302  0.0  0.0 112640   924 pts/0    R+   22:41   0:00 grep --color=auto mysql</sxh></WRAP>
-  - **netstat** <code># netstat -tulpn | grep 3306</code><WRAP center round box 100%><sxh bash; gutter: false>Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    +  - Netzwerk Überprüfung mit **netstat**: <WRAP center box 100%><code># netstat -tulpn | grep 3306</code><sxh bash; gutter: false>Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
 tcp        0      0 127.0.0.1:25            0.0.0.0:              LISTEN      1728/master          tcp        0      0 127.0.0.1:25            0.0.0.0:              LISTEN      1728/master         
 tcp        0      0 0.0.0.0:3306            0.0.0.0:              LISTEN      27198/mysqld         tcp        0      0 0.0.0.0:3306            0.0.0.0:              LISTEN      27198/mysqld        
Line 208: Line 205:
 </sxh> </sxh>
 </WRAP> </WRAP>
 +</panel>
  
 ---- ----
Line 249: Line 247:
 Unter **RHEL 7** und **CentOS 7** wird als Standard-Firewall die dynamische **firewalld** verwendet. Ein grosser Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbindungen kurz getrennt werden. Sondern unsere Änderungen können **on-the-fly** aktiviert oder auch wieder deaktiviert werden. Unter **RHEL 7** und **CentOS 7** wird als Standard-Firewall die dynamische **firewalld** verwendet. Ein grosser Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbindungen kurz getrennt werden. Sondern unsere Änderungen können **on-the-fly** aktiviert oder auch wieder deaktiviert werden.
  
-In meinem kleinen Konfigurationsbeispiel hat der ''**MariaDB-Server** die IP-Adresse **10.0.0.37**'' und der ''**Applikations-Server** die **10.0.0.27**''. Nun braucht man also eine neue Firewall-Regen, die ausschliesslich Verbindungen der **Source-IP: 10.0.0.27** auf die **Destination-IP: 10.0.0.37** auf **Port 3306** gestattet. Mit nachfolgendem Befehl wird diese restriktive Regel angelegt:+In meinem kleinen Konfigurationsbeispiel hat der ''**MariaDB-Server** die IP-Adresse **10.0.0.37**'' und der ''**Applikations-Server** die **10.0.0.27**''<wrap em>Nun braucht man also eine neue Firewall-Regen, die ausschliesslich Verbindungen der **Source-IP: 10.0.0.27** auf die **Destination-IP: 10.0.0.37** auf **Port 3306** gestattet.</wrap> Mit nachfolgendem Befehl wird diese restriktive Regel angelegt:
  
 <code> <code>
Line 258: Line 256:
  
 <code> <code>
- # firewall-cmd --reload+# firewall-cmd --reload
 </code> </code>
  
 +''Fragt man nun den Regelsatz unserer **iptables**-basieten Firewall ab, finden wir in der Chain **IN_public_allow** unsere aktive Regel.''
  
-Fragt man nun den Regelsatz unserer **iptables**-basieten Firewall ab, finden wir in der Chain **IN_public_allow** unsere aktive Regel. 
- 
-<WRAP center box 100%> 
 <code> <code>
- # iptables -nvL IN_public_allow+# iptables -nvL IN_public_allow
 </code> </code>
  
 <sxh bash; gutter: false> <sxh bash; gutter: false>
- Chain IN_public_allow (1 references) +Chain IN_public_allow (1 references) 
- pkts bytes target     prot opt in     out     source               destination          +pkts bytes target     prot opt in     out     source               destination          
-  10K   25K ACCEPT     tcp  --  *      *       10.0.0.27            10.0.0.37            tcp dpt:3306 ctstate NEW +10K   25K ACCEPT     tcp  --  *      *       10.0.0.27            10.0.0.37            tcp dpt:3306 ctstate NEW 
- 2656  159K ACCEPT     tcp  --  *      *       0.0.0.0/           0.0.0.0/           tcp dpt:22 ctstate NEW+2656  159K ACCEPT     tcp  --  *      *       0.0.0.0/           0.0.0.0/           tcp dpt:22 ctstate NEW
 </sxh> </sxh>
-</WRAP> 
  
-Natürlich kann auch mit dem Befehl **firewall-cmd** abgefragt werden, welche Dienste in der Zone **public** geöffnet sind. 
  
-<WRAP center box 100%>+''Natürlich kann auch mit dem Befehl **firewall-cmd** abgefragt werden, welche Dienste in der Zone **public** geöffnet sind.'' 
 <code> <code>
- # firewall-cmd --zone=public --list-services+# firewall-cmd --zone=public --list-services
 </code> </code>
  
Line 287: Line 282:
 mysql ssh mysql ssh
 </sxh> </sxh>
-</WRAP> 
- 
 </WRAP> </WRAP>
  
Line 297: Line 290:
 Wie bei der doch grossen Ausgabe beim erstmaligen Start des Datenbank-Daemons angeraten, werden wir nun die __sicherheitsrelevanten Konfigurationsänderungen__ vornehmen. Wie bei der doch grossen Ausgabe beim erstmaligen Start des Datenbank-Daemons angeraten, werden wir nun die __sicherheitsrelevanten Konfigurationsänderungen__ vornehmen.
  
-Hierzu benutzen wir einfach das mitgelieferte Script **/usr/bin/mysql_secure_installation**, welches folgende Änderungen vornimmt:+Zuvor, generieren wir jedoch noch einen sicheren DB-Schlüssel für den MariaDB-Root User und speichern ihn unter /root/ mit folgenden Befehl ab: 
 + 
 +<code> 
 +# openssl rand -base64 30 > /root/.mariadb-root-pw && cat /root/.mariadb-root-pw 
 +</code> 
 + 
 +Anschliessend, benutzen wir einfach das mitgelieferte Script **/usr/bin/mysql_secure_installation**, welches folgende Änderungen vornimmt:
  
   - Datenbankpasswort des MySQL-Datenbankuser **root** setzen   - Datenbankpasswort des MySQL-Datenbankuser **root** setzen
Line 311: Line 310:
 # /usr/bin/mysql_secure_installation</code> # /usr/bin/mysql_secure_installation</code>
  
-<sxh plain; gutter: false;> +<sxh plain; gutter: false; highlight: [9,15-17,29,35,42,51]> 
-Enter current password for root (enter for none): Enter +NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB 
-Set root password? [Y/n]: Y +      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY! 
-New password: <your-password> + 
-Re-enter new password: <your-password> +In order to log into MariaDB to secure it, we'll need the current 
-Remove anonymous users? [Y/n]: Y +password for the root user.  If you've just installed MariaDB, and 
-Disallow root login remotely? [Y/n]: Y +you haven't set the root password yet, the password will be blank, 
-Remove test database and access to it? [Y/n]: Y +so you should just press enter here. 
-Reload privilege tables now? [Y/n]: Y+ 
 +Enter current password for root (enter for none): ENTER 
 +OK, successfully used password, moving on... 
 + 
 +Setting the root password ensures that nobody can log into the MariaDB 
 +root user without the proper authorisation. 
 + 
 +Set root password? [Y/n] y 
 +New password:           *EINGABE DES ZUVOR GENERIERTEN MARIADB-ROOT-PWs* 
 +Re-enter new password:  *EINGABE DES ZUVOR GENERIERTEN MARIADB-ROOT-PWs* 
 +Password updated successfully! 
 +Reloading privilege tables.. 
 + ... Success! 
 + 
 + 
 +By default, a MariaDB installation has an anonymous user, allowing anyone 
 +to log into MariaDB without having to have a user account created for 
 +them.  This is intended only for testing, and to make the installation 
 +go a bit smoother.  You should remove them before moving into a 
 +production environment. 
 + 
 +Remove anonymous users? [Y/n] 
 + ... Success! 
 + 
 +Normally, root should only be allowed to connect from 'localhost' This 
 +ensures that someone cannot guess at the root password from the network. 
 + 
 +Disallow root login remotely? [Y/n] 
 + ... Success! 
 + 
 +By default, MariaDB comes with a database named 'test' that anyone can 
 +access.  This is also intended only for testing, and should be removed 
 +before moving into a production environment. 
 + 
 +Remove test database and access to it? [Y/n] 
 + - Dropping test database... 
 + ... Success! 
 + - Removing privileges on test database... 
 + ... Success! 
 + 
 +Reloading the privilege tables will ensure that all changes made so far 
 +will take effect immediately. 
 + 
 +Reload privilege tables now? [Y/n] 
 + ... Success! 
 + 
 +Cleaning up... 
 + 
 +All done!  If you've completed all of the above steps, your MariaDB 
 +installation should now be secure. 
 + 
 +Thanks for using MariaDB! 
 </sxh> </sxh>
 </WRAP> </WRAP>
Line 325: Line 376:
 ---- ----
  
 +<WRAP center box 100%>
 +==== Erstellen einer Initialen Datenbank ====
 +''Um sich in Mariadb eine neue Datenbank zu erstellen, wird folgendermassen vorgegangen:''
 +
 +  - Einloggen in die Mariadb als root: <code># mysql -u root --password=$(cat /root/.mariadb-root-pw)</code>
 +  - Erstellen der ersten Datenbank: <sxh bash: gutter: false>CREATE DATABASE mydatabase;</sxh> ''**Note:** Every MySQL statement or command must end in a semi-colon (;), so check to make sure that this is present if you are running into any issues.''
 +  - Next, we are going to create a new MySQL user account that we will use exclusively to operate on our new database. I am going to call the ''**new account** "dbuser"'' and will assign it ''a **password** of "dbuserpasswort"''. <sxh bash: gutter: false>CREATE USER dbuser@localhost IDENTIFIED BY 'dbuserpasswort';</sxh>
 +  - At this point, you have a database and user account that are each specifically made for our new environment. However, the user has no access to the database. We need to link the two components together by granting our user access to the database.<sxh bash: gutter: false>GRANT ALL PRIVILEGES ON mydatabase.* TO dbuser@localhost IDENTIFIED BY 'dbuserpasswort';</sxh>
 +  - Now that the user has access to the database, we need to flush the privileges so that MySQL knows about the recent privilege changes that we've made: <sxh bash: gutter: false>FLUSH PRIVILEGES;</sxh>
 +  - Once these commands have all been executed, we can exit out of the MySQL command prompt by typing: <sxh plain: gutter: false>exit</sxh>
 +
 +<wrap em>ACHTUNG: UM Zugriff mit php auf die mariadb zu erhalten, muss hierfür noch das php-mysql Packet installiert werden!</wrap>
 +
 +</WRAP>
 +
 +<WRAP center round tip 100%>
 +''**Vorhandenen Datenbank-Dump in neu erstellte Datenbank schreiben:**''
 +
 +<code># mysql -u root --password=$(cat /root/.mariadb-root-pw) -h localhost mydatabase < mysqldump.sql</code>
 +</WRAP>
 +
 +
 +----
  
 ==== Logrotate ==== ==== Logrotate ====
Line 466: Line 540:
 </sxh> </sxh>
  
-----+
 ===== Datenbankhandling ===== ===== Datenbankhandling =====
  
Line 472: Line 546:
 Mit Hilfe des Hilfsprogrammes **mysqladmin** aus dem Clientpaket **mysql** können umfangreiche Abfrage gegen unsere Datenbank durchgeführt werden. Startet man das Programm ohne weitere Angaben von Optionen, werden die möglichen Optionen am Bildschirm ausgegeben. Mit Hilfe des Hilfsprogrammes **mysqladmin** aus dem Clientpaket **mysql** können umfangreiche Abfrage gegen unsere Datenbank durchgeführt werden. Startet man das Programm ohne weitere Angaben von Optionen, werden die möglichen Optionen am Bildschirm ausgegeben.
  
 +<WRAP center box 100%>
 <code> <code>
  # mysqladmin  # mysqladmin
 </code> </code>
  
-<WRAP center round box 100%> +<sxh plain; gutter: false;>
-<code>+
 mysqladmin  Ver 9.0 Distrib 5.5.41-MariaDB, for Linux on x86_64 mysqladmin  Ver 9.0 Distrib 5.5.41-MariaDB, for Linux on x86_64
 Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others. Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
Line 605: Line 679:
   variables             Prints variables available   variables             Prints variables available
   version               Get version info from server   version               Get version info from server
-</code>+</sxh>
 </WRAP> </WRAP>
  
 So können wir z.B. auch die verwendete Version von **MariaDB** abfragen. So können wir z.B. auch die verwendete Version von **MariaDB** abfragen.
  
 +<WRAP center box 100%>
 <code> <code>
 # mysqladmin version # mysqladmin version
 </code> </code>
  
-<WRAP center round box 100%> +<sxh plain; gutter: false;>
-<code>+
 mysqladmin  Ver 9.0 Distrib 5.5.41-MariaDB, for Linux on x86_64 mysqladmin  Ver 9.0 Distrib 5.5.41-MariaDB, for Linux on x86_64
 Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others. Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
Line 626: Line 700:
  
 Threads: 1  Questions: 27  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.002 Threads: 1  Questions: 27  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.002
-</code>+</sxh>
 </WRAP> </WRAP>
  
 ---- ----
 +
 ==== mysql ==== ==== mysql ====
 Der Zugriff auf unseren MariaDB-Server wird in der Regel mit dem Werkzeug **mysql** vorgenommen. So kann man auch z.B. sehr leicht und einfach den Status unseres Datenbankservers abfragen. Der Zugriff auf unseren MariaDB-Server wird in der Regel mit dem Werkzeug **mysql** vorgenommen. So kann man auch z.B. sehr leicht und einfach den Status unseres Datenbankservers abfragen.
Line 702: Line 777:
  
 ---- ----
 +
 ==== Datenbank-Dump ==== ==== Datenbank-Dump ====
 Zur Sicherung unserer MariaDB-Tabellen legen wir uns ein kleines Script an, mit dessen Hilfe wir täglich eine Sicherung der kompletten Datenbank vornehmen können. Zur Sicherung unserer MariaDB-Tabellen legen wir uns ein kleines Script an, mit dessen Hilfe wir täglich eine Sicherung der kompletten Datenbank vornehmen können.
Line 1021: Line 1097:
  
 ---- ----
 +
 ==== phpMyAdmin ==== ==== phpMyAdmin ====
  
 <WRAP center round tip 90%> <WRAP center round tip 90%>
-Zur komfortablen Administration unserer **MariaDB unter RHEL 7 und CentOS 7** kann man auf das PHP-Projekt [[http://phpmyadmin.sourceforge.net/|phpMyAdmin]] zurück greifen.  +''Zur komfortablen Administration unserer **MariaDB unter RHEL 7 und CentOS 7** kann man auf das PHP-Projekt [[http://phpmyadmin.sourceforge.net/|phpMyAdmin]] zurück greifen.'' 
-Im Kapitel **''[[redhat:database-redhat:phpmyadmin-redhat|phpMyAdmin für Redhat]]''** ist die Installation und Konfiguration des PHP Projektes für RHEL7 beschrieben.+ 
 +''Im Kapitel **[[redhat:database-redhat:phpmyadmin-redhat|phpMyAdmin für Redhat]]** ist die Installation und Konfiguration des PHP Projektes für RHEL7 beschrieben.''
 </WRAP> </WRAP>
  
  
  • redhat/database-redhat/start.1505315219.txt.gz
  • Last modified: 2017/09/13 17:06
  • by michael