Witam. Zacznę od początku.
Mam serwer prywatny, który sobie hostuje na virtualboxie na Windowsie 10.
Serwer ten ma zainstalowany system Ubuntu Server 24.04.
Skonfigurowałem w nim nginxa z sslem.
SSL w nginxie jest skonfigurowany poprzez LetsEncrypt i certbota.
Certyfikaty LetsEncrypta znajdują się w katalogu /etc/letsencrypt/live/
Mam folder /server, w którym przechowuje wszystkie dane odnośnie serwera (serwer www, api do www, certyfikaty).
Tak wygląda struktura katalogu /server:
tracer@server:/server$ ls -al
total 20
drwxrwxr-x 5 Server Server 4096 sie 12 10:56 .
drwxr-xr-x 24 root root 4096 wrz 2 17:12 ..
drwxrwxr-x 2 Server Server 4096 sie 12 10:53 certs
drwxrwxr-x 3 Server Server 4096 sie 8 21:49 www
drwxrwxr-x 4 Server Server 4096 lip 15 19:04 www-api
Tak wygląda struktura katalogu /server/certs:
tracer@server:/server$ ls -al certs
total 24
drwxrwxr-x 2 Server Server 4096 sie 12 10:53 .
drwxrwxr-x 5 Server Server 4096 sie 12 10:56 ..
lrwxrwxrwx 1 root Server 64 lip 15 13:04 cert.pem -> /etc/letsencrypt/live/moja.domena.pl/cert.pem
lrwxrwxrwx 1 root Server 65 lip 15 13:04 chain.pem -> /etc/letsencrypt/live/moja.domena.pl/chain.pem
lrwxrwxrwx 1 root Server 69 lip 15 13:05 fullchain.pem -> /etc/letsencrypt/live/moja.domena.pl/fullchain.pem
lrwxrwxrwx 1 root Server 67 lip 15 13:04 privkey.pem -> /etc/letsencrypt/live/moja.domena.pl/privkey.pem
Jak widać mam zlinkowane pojedyncze certyfikaty zamiast całego folderu dla lepszej kompatybilności.
Teraz pojawia się problem: usługa MySQL nie widzi tych certyfikatów; nie potrafi ich odczytać, jednakże
użytkownik mysql (demon mysql startuje jako user mysql) może je odczytać a nawet modyfikować:
tracer@server:/server$ cat /test.sh
whoami
groups
echo ""
cat /server/certs/privkey.pem
tracer@server:/server$ sudo runuser -u mysql -- "/test.sh"
mysql
mysql Server
-----BEGIN PRIVATE KEY-----
:)
-----END PRIVATE KEY-----
Po uruchomieniu usługi MySQL w logach (/var/logs/mysql/error.log) pojawia się taki błąd:
tracer@server:/var/log$ sudo tail /var/log/mysql/error.log
2024-09-02T15:27:35.064721Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.37-0ubuntu0.24.04.1) starting as process 3631
2024-09-02T15:27:35.079792Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-09-02T15:27:35.747056Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-09-02T15:27:36.802688Z 0 [ERROR] [MY-000059] [Server] SSL error: Unable to get private key from '/server/certs/fullchain.pem'.
2024-09-02T15:27:36.803524Z 0 [Warning] [MY-013595] [Server] Failed to initialize TLS for channel: mysql_main. See below for the description of exact issue.
2024-09-02T15:27:36.803819Z 0 [Warning] [MY-010069] [Server] Failed to set up SSL because of the following SSL library error: Unable to get private key
2024-09-02T15:27:36.910980Z 0 [Warning] [MY-011302] [Server] Plugin mysqlx reported: 'Failed at SSL configuration: "SSL context is not usable without certificate and private key"'
2024-09-02T15:27:36.912737Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '192.168.0.55' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2024-09-02T15:27:36.913478Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.37-0ubuntu0.24.04.1' socket: '/var/run/mysqld/mysqld.sock' port: 3306 (Ubuntu).
Po dniach szukania rozwiązania okazało się że być może AppArmor sprawia tutaj problemy.
Dodałem te oto linie do pliku /etc/apparmor.d/usr.sbin.mysqld:
/server/ r,
/server/** r,
/server/certs/ r,
/server/certs/** r,
Całość wygląda w następujący sposób:
# vim:syntax=apparmor
# Last Modified: Tue Feb 09 15:28:30 2016
#include <tunables/global>
/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
#include <abstractions/mysql>
#include <abstractions/winbind>
# Allow system resource access
/server/ r,
/server/** r,
/server/certs/ r,
/server/certs/** r,
/proc/*/status r,
/sys/devices/system/cpu/ r,
/sys/devices/system/node/ r,
/sys/devices/system/node/** r,
capability sys_resource,
capability dac_override,
capability dac_read_search,
capability setuid,
capability setgid,
# Allow network access
network tcp,
/etc/hosts.allow r,
/etc/hosts.deny r,
# Allow config access
/etc/mysql/** r,
# Allow pid, socket, socket lock file access
/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock rw,
/var/run/mysqld/mysqld.sock.lock rw,
/var/run/mysqld/mysqlx.sock rw,
/var/run/mysqld/mysqlx.sock.lock rw,
/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock rw,
/run/mysqld/mysqld.sock.lock rw,
/run/mysqld/mysqlx.sock rw,
/run/mysqld/mysqlx.sock.lock rw,
# Allow systemd notify messages
/{,var/}run/systemd/notify w,
# Allow execution of server binary
/usr/sbin/mysqld mr,
/usr/sbin/mysqld-debug mr,
# Allow plugin access
/usr/lib/mysql/plugin/ r,
/usr/lib/mysql/plugin/*.so* mr,
# Allow error msg and charset access
/usr/share/mysql/ r,
/usr/share/mysql/** r,
# Allow data dir access
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
# Allow data files dir access
/var/lib/mysql-files/ r,
/var/lib/mysql-files/** rwk,
# Allow keyring dir access
/var/lib/mysql-keyring/ r,
/var/lib/mysql-keyring/** rwk,
# Allow log file access
/var/log/mysql.err rw,
/var/log/mysql.log rw,
/var/log/mysql/ r,
/var/log/mysql/** rw,
# Allow read access to mecab files
/var/lib/mecab/dic/ipadic-utf8/** r,
# Allow read access to OpenSSL config
/etc/ssl/openssl.cnf r,
# Site-specific additions and overrides. See local/README for details.
#include <local/usr.sbin.mysqld>
}
Nie wiem co robić dalej.
Jakieś pomysły?