Page 1 of 1

[gelöst] FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 16:15
by pinkiehaut
Hallo,

ich stehe leider ziemlich auf dem Schlauch was den Fehler angeht.

Ich habe 3 Jails:

www
db
voice

Ich möchte von der www Jail per mysql Port 3306 (wordpress) auf die db Jail zugreifen.
Leider funktioniert dies nicht. Die pf Regeln und die Netzwerk Config sollten doch korrekt sein oder.
Habe die letzten Tage ziemlich viel darüber gelesen und weiss so langsam nicht mehr an was ich glauben soll :-)

Hier meine Config:

/etc/rc.conf (Host)

Code: Select all

hostname="myhost.net"

font8x14="iso15-8x14"
font8x16="iso15-8x16"
font8x8="iso15-8x8"
keymap="german.iso.acc.kbd"

ifconfig_vtnet0="inet 192.168.0.10  netmask 255.255.255.0"
defaultrouter="192.168.0.1"

cloned_interface="lo0"

ifconfig_lo0="inet 10.0.0.254 netmask 255.255.255.0"
ifconfig_lo0_alias0="inet 10.0.0.1 netmask 255.255.255.0"
ifconfig_lo0_alias1="inet 10.0.0.2 netmask 255.255.255.0"
ifconfig_lo0_alias2="inet 10.0.0.3 netmask 255.255.255.0"
ifconfig_lo0_alias3="inet 10.0.0.4 netmask 255.255.255.0"

gateway_enable="YES"

ezjail_enable="YES"
sendmail_enable="NONE"
sshd_enable="YES"
openntpd_enable="YES"
dumpdev="NO"

syslogd_flags="-ss -a 127.0.0.1 -C"

pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile=/var/log/pflog

expiretable_enable="YES"
expiretable_flags="-v -d -t 24h bruteforce"
/etc/pf.conf

Code: Select all

if = "{ vtnet0 }"
if_lo = "{ lo0 }"

table <rfc1918> persist { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/5 }
table <sshguard> persist
table <bruteforce> persist

icmp_types = "echoreq"
open_tcp = "{ 2233, 80, 443, 2008, 10011, 30033, 41144 }"
open_udp = "{ 2233, 80, 2010, 9987 }"

jails = "{ 10.0.0.1, 10.0.0.2, 10.0.0.3 }"
ip = 192.168.0.10

jwww_tcp_udp = "{ 80, 443 }"
jts3_tcp = "{ 30033, 10011, 41144, 2008 }"
jts3_udp = "{ 9987, 2010 }"
jmariadb = "{ 3306 }"

www = 10.0.0.1
db  = 10.0.0.2
ts3 = 10.0.0.3

set block-policy drop
set skip on lo0
set timeout { interval 10, frag 30 }
set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 }
set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 }
set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
set timeout { icmp.first 20, icmp.error 10 }
set timeout { other.first 60, other.single 30, other.multiple 60 }
set timeout { adaptive.start 0, adaptive.end 0 }
set limit { states 10000, frags 5000 }
set loginterface re0
set optimization normal
set require-order yes
set fingerprints "/etc/pf.os"
set ruleset-optimization basic

scrub in all fragment reassemble random-id

rdr on $if proto {tcp udp} from any to $if port $jwww_tcp_udp -> $www
rdr on $if proto tcp from any to $if port $jts3_tcp  -> $ts3
rdr on $if proto udp from any to $if port $jts3_udp  -> $ts3

nat on $if from $jails to any -> $ip

block log all
block return
block in quick on $if inet from <rfc1918> to any
block in quick on $if proto tcp from <sshguard> to any port 2233 label "ssh bruteforce"
block quick from <bruteforce>

antispoof quick for $if

pass in on $if proto tcp from any to any port $open_tcp flags S/SA keep state (max-src-conn 100, max-src-conn-rate 15/5, overload <bruteforce> flush global)
pass in on $if proto udp from any to any port $open_udp keep state
pass out quick all keep state
pass in on $if inet proto icmp all icmp-type $icmp_types keep state
pass in on $if inet proto udp from any to any port 33433 >< 33626 keep state

pass in quick on $if_lo proto tcp from $www port $jmariadb to $db
pass out quick on $if_lo proto tcp from $www port $jmariadb to $db
pass in quick on $if_lo proto tcp from $db port $jmariadb to $www
pass out quick on $if_lo proto tcp from $db port $jmariadb to $www
my.cnf der db Jail

Code: Select all

[client]
port                            = 3306
socket                          = /tmp/mysql.sock

# The MariaDB server
[mysqld]
port                            = 3306
socket                          = /tmp/mysql.sock
key_buffer_size                 = 256M
max_allowed_packet              = 16M
table_open_cache                = 256
sort_buffer_size                = 4M
net_buffer_length               = 16M
read_buffer_size                = 1M
read_rnd_buffer_size            = 4M
myisam_sort_buffer_size         = 256M

thread_cache_size               = 128
query_cache_size                = 53M
max_connections                 = 100
connect_timeout                 = 5
wait_timeout                    = 600
bulk_insert_buffer_size         = 16M
tmp_table_size                  = 32M
max_heap_table_size             = 32M

skip-external-locking

#skip-networking
bind-address                    = 127.0.0.1
thread_concurrency              = 4
tmpdir                          = /tmp/
log-bin                         = mysql-bin
binlog_format                   = mixed
general_log_file                = /var/log/mysql/mysql.log
general_log                     = 1
server-id                       = 1
log_warnings                    = 2
slow_query_log_file             = /var/log/mysql/mariadb-slow.log
long_query_time                 = 10
log_slow_verbosity              = query_plan
local-infile                    = 0

[mysqldump]
quick
max_allowed_packet              = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size                 = 128M
sort_buffer_size                = 128M
read_buffer                     = 2M
write_buffer                    = 2M

[mysqlhotcopy]
interactive-timeout
Sieht jemand von Euch den Fehler ?


Gruß

Pinki

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 16:22
by ddm3ve
Wirf die binadadfress raus und nutze sockets. Schon hast Du das Problem mit Firewall und co behoben.

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 16:43
by pinkiehaut
Hallo,

leider hab ich das noch nie gemacht. Daher die Frage eines unwissenden, wie geht das ?
Wenn ich die bind adress rausnehme kann ich per TCP nicht mehr auf mysql zugreifen.

Wie nutze ich nun den socket am besten ?

Ich denke ich muss z.B. /tmp/mysql.sock irgendwie in die www Jail mounten oder ?

Und wie krieg ich da mein Wordpress dran?

Mit

Code: Select all

define('DB_HOST', 'localhost:/mein/mount/point/mysql.sock');
etwa ?

Gruß

Pinki

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 17:04
by ddm3ve
1. Doku zu den Connection Parameter.
http://php.net/manual/de/mysqli.quickst ... ctions.php

Was den Jail anbetrifft kann ich dir ad hoc nicht weiter helfen. Aber docket Verbindungen sind deutlich schneller als über TCP.

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 17:06
by ddm3ve
Etwas älter, aber das könnte eine gute Anlaufstelle für Dein Vorhaben sein:
http://lists.freebsd.org/pipermail/free ... 01456.html

http://stackoverflow.com/questions/5951 ... nd-sockets

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 17:45
by daemotron
Von Jail zu Jail ist TCP schon in Ordnung; da sind Unix Sockets eine schlechte Idee (man müsste sonst über Kreuz Dateisysteme mounten, und das führt wieder zu Ausbruchsmöglichkeiten - also lieber sein lassen). Lediglich Deine PF-Regel ist falsch. Du schreibst:

Code: Select all

pass quick on lo0 from 10.0.0.1 port 3306 to 10.0.0.2
Damit erlaubst Du nur Verbindungen, die als ausgehenden Port den Port 3306 nutzen. Du willst aber eine Verbindung zum Zielport 3306 haben. Ersetze deine unteren vier Zeilen durch dieses:

Code: Select all

pass quick on lo0 inet proto tcp from 10.0.0.1 to 10.0.0.2 port 3306 flags S/SA keep state
Diese Regel besagt
  • Erlaube auf lo0 von 10.0.01 ausgehende Verbindungen vom Typ TCP, die 10.0.0.2:3306 zum Ziel haben
  • Erlaube auf lo0 eingehende Verbindungen vom Typ TCP an 10.0.0.2:3306, die von 10.0.0.1 kommen
Die IPs und Ports kannst Du natürlich wieder durch Makros ersetzen. Für Well-known Ports kannst Du aber auch einfach die Namen benutzen, also ssh, https, mysql etc. versteht PF auch ganz ohne die Definition von Makros.

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 17:55
by daemotron
ddm3ve wrote:Aber docket Verbindungen sind deutlich schneller als über TCP.
Bedingt... wenn man (wie im Beispiel) TCP über das Loopback-Interface laufen lässt, ist der Overhead kaum größer als bei Unix Sockets (etwas schon, da ja noch TCP-Pakete gepackt werden müssen). Grundsätzlich kann man Sockets nutzen, muss diese aber über zusätzliche nullfs-Mounts in den verschiedenen Jails verfügbar machen, welche wiederum selbst einen gewissen Overhead erzeugen, der etwa mit dem Overhead des Loopback-Interface vergleichbar sein dürfte.

Theoretisch sollte das sogar einigermaßen sicher sein; in der Praxis hat es dafür aber schon eine Reihe von Exploits gegeben (genauso wie etwa bei der Freigabe von System V IPC Primitives). Wenn man also unbedingt auf Sockets setzen möchte, kann man sich die Jails eigentlich auch gleich sparen - dann entfällt der Overhead von nullfs, man gewinnt etwas Performance und muss nicht über Scheinsicherheit von Jails bei geteilten Dateideskriptoren nachdenken. Möchte man Jails mit Sicherheitsgewinn, muss man auf geteilte Dateideskriptoren und System V IPC Primitiven verzichten.

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 19:05
by Joe User
Zusätzlich zu dem was daemotron schrieb, musst Du noch bind-address in der my.cnf auf die IP-Adresse des DB-Jail setzen und die DB restarten.



Nebenbei sei darauf hingewiesen, dass sich die Alias-Konfigurationssyntax für Netzwerkinterfaces mit FreeBSD 10.0 geändert hat und "cloned_interfaces" sowie "ifconfig_iface_aliasN" nicht mehr genutzt werden sollten. Spätestens mit FreeBSD 11 soll die alte Syntax endgültig wegfallen.

Also bei Gelegenheit mal die rc.conf und all die anderen Konfigurationsdateien auf den aktuellen Stand bringen. Es tat und tut sich ständig etwas damit uns Admins nicht langweilig wird ;)

Re: FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-01 22:28
by pinkiehaut
Hallo und vielen vielen Dank,

mein Abend ist gerettet :-)

Die my.cnf hatte ich aus einem meiner Tests kopiert, diese war schon entsprechend angepasst.
Nach Anpassung der pf.conf und einem erfogreichen Test kann ich nur sagen

/solved

Viele Grüße

Pinkie

Re: [gelöst] FreeBSD 10 Zugriff www Jail zu db Jail

Posted: 2014-09-05 12:32
by Joe User
Deine aktualisierte rc.conf

Code: Select all

hostname="myhost.net"

font8x14="iso15-8x14"
font8x16="iso15-8x16"
font8x8="iso15-8x8"
keymap="german.iso.acc.kbd"

ifconfig_vtnet0="inet 192.168.0.10  netmask 255.255.255.0"
defaultrouter="192.168.0.1"

ifconfig_lo0="inet 10.0.0.254 netmask 255.255.255.0"
ifconfig_lo0_aliases="\
                    inet 10.0.0.1 netmask 255.255.255.0 \
                    inet 10.0.0.2 netmask 255.255.255.0 \
                    inet 10.0.0.3 netmask 255.255.255.0 \
                    inet 10.0.0.4 netmask 255.255.255.0 "

gateway_enable="YES"

ezjail_enable="YES"
sendmail_enable="NONE"
sshd_enable="YES"
openntpd_enable="YES"
dumpdev="NO"

syslogd_flags="-ss -a 127.0.0.1 -C"

pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile=/var/log/pflog

expiretable_enable="YES"
expiretable_flags="-v -d -t 24h bruteforce"