• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problemy z MySQLem i AppArmorem w Ubuntu

Cloud VPS
0 głosów
144 wizyt
pytanie zadane 2 września 2024 w Systemy operacyjne, programy przez Tracer Użytkownik (560 p.)

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?

1 odpowiedź

0 głosów
odpowiedź 7 września 2024 przez Gynvael Coldwind Nałogowiec (30,510 p.)
Jeśli to faktycznie apparmour, to na oko musisz jeszcze dać dostęp mysqlowi dostęp do samego /etc/letsencrypt/live/moja.domena.pl/

Wynikać to może z tego, że póki co dałeś dostęp tylko do linków – więc apparmour pozwoli mysqlowi zobaczyć gdzie link prowadzi (tj. odczytać sam link), ale już nie pozwoli na dostęp do pliku na który link wskazuje, bo ten jest poza wyznaczonymi granicami. W drugą stronę: jeśli by tak nie było, to wystarczyło by zrobić sobie link symboliczny do / i można by zupełnie obejść apparmour, który jednak ma być systemem bezpieczeństwa.

Innym rozwiązaniem jest użycie mount --bind na katalogu, albo hardlinki zamiast soft linków (co zadziała tylko jeśli to ten sam "dysk").

Podobne pytania

0 głosów
1 odpowiedź 229 wizyt
pytanie zadane 31 grudnia 2016 w Systemy operacyjne, programy przez rafal1997 Gaduła (3,180 p.)
0 głosów
0 odpowiedzi 935 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...