рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдИ рд╕рд░реНрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рд╣реИрдВред рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдВрдкрдиреА рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд╛рдЧ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХреЗрдВрджреНрд░реАрдХреГрдд рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рд╕реВрдЪреА:
- admin.example.com - рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди рд╕рд░реНрд╡рд░, DNS, CRM
- www.example.com - рд╡реЗрдм рд╕рд░реНрд╡рд░
- app.example.com - рдПрдкрд╛рдЪреЗ рдЯреЙрдордХреИрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░
- mysql.example.com - mysql рд╕рд░реНрд╡рд░
рдореВрд▓ рд╕реЗрдЯрд┐рдВрдЧ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ ssh рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
class firewall { exec { 'minimal-firewall': path => ["/bin", "/sbin", "/usr/bin", "/usr/sbin"], command => "iptables -P INPUT DROP \ && iptables -P FORWARD DROP \ && iptables --flush \ && iptables -t nat --flush \ && iptables --delete-chain \ && iptables -P FORWARD DROP \ && iptables -P INPUT DROP \ && iptables -A INPUT -i lo --source 127.0.0.1 --destination 127.0.0.1 -j ACCEPT \ && iptables -A INPUT -m state --state \"ESTABLISHED,RELATED\" -j ACCEPT \ && iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT \ && iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT \ && iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT \ && iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT \ && iptables -A INPUT -p tcp --dport ssh -j ACCEPT \ && iptables -A INPUT -j LOG -m limit --limit 40/minute \ && iptables -A INPUT -j DROP", } }
рдпрд╣рд╛рдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИред Iptables рдирд┐рдпрдо "iptables рдиреНрдпреВрдирддрдо рдлрд╝рд╛рдпрд░рд╡реЙрд▓" рдкрд░ Google рд╣реИрдВ, рдкрд╣рд▓рд╛ рд▓рд┐рдВрдХ рд╕рд╣реА рд╣реИред рдХреЗрд╡рд▓ рдЕрдВрддрд░: рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдПрдХ рдЕрд▓рдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ
&&
рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдардкреБрддрд▓реА рдиреЛрдб рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╡рд░реНрдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
node 'www' { include firewall }
рд╣реЛрд╕реНрдЯ рдирд╛рдо FQDN рдпрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрд╕реНрдЯ рдирд╛рдо рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрдардкреБрддрд▓реА рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рд░ рддреАрд╕ рдорд┐рдирдЯ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдереЛрдбрд╝рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ SITEUP рд╕рдВрдХреЗрдд рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдмрд╕ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ:
iptables -L
ред
рдЗрдирдкреБрдЯ рдкреЛрд░реНрдЯ рдЦреЛрд▓реЗрдВ
рдереЛрдбрд╝реА рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдирд┐рдпрдореЛрдВ рдХреЛ iptables рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреНрд░рдо, рдЕрдЧрд░ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдирдпрд╛ рдирд┐рдпрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдирдП рдирд┐рдпрдо рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдХрдорд╛рдВрдб
iptables -L --line-numbers
рдФрд░ ssh
7 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рджреЗрдЦреЗрдВ
7 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВ
7 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд┐рдпрдо 7 рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред
define allowport ($protocol, $port) { exec { "/sbin/iptables -I INPUT 7 -p $protocol --dport $port -j ACCEPT": require => Exec['minimal-firewall'], } }
рдлрд┐рд░ www рдиреЛрдб рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдмрди рдЬрд╛рддрд╛ рд╣реИ:
node 'www' { allowport { http: protocol => tcp, port => 80, } allowport { https: protocol => tcp, port => 443, } include firewall }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдХрдардкреБрддрд▓реА рд╡рд░реНрдгрдирд╛рддреНрдордХ рднрд╛рд╖рд╛ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИ, рдирд┐рдпрдо рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рд╕рдорд╛рди, рдкрд╣рд▓реЗ 'рдЖрдпрд╛рдд рдлрд╝рд╛рдпрд░рд╡реЙрд▓' рдФрд░ рдлрд┐рд░ 'рдЕрдиреБрдорддрд┐' рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдиреНрдпреВрдирддрдо рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдирд┐рдпрдо рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА - рдкреЛрд░реНрдЯ рдХрд╛ рдЙрджреНрдШрд╛рдЯрдиред рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрдиреБрдорддрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рд╣реИ -
require => Exec['minimal-firewall']
рдирд┐рд╖реНрдкрд╛рджрд┐рдд
require => Exec['minimal-firewall']
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди:
node 'admin' { allowport { dns1: protocol => tcp, port => 53, } allowport { dns2: protocol => udp, port => 53, } allowport { http: protocol => tcp, port => 80, } allowport { webmin: protocol => tcp, port => 10000, } include firewall }
рдирд┐рдпрдореЛрдВ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдВ
рдЯреЙрдордХреИрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рдЗрд╕реЗ рдорд╛рдирдХ 443 рдкреЛрд░реНрдЯ рд╕реЗ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдЕрдиреБрд╡рд╛рдж (DNAT) 443 рдкреЛрд░реНрдЯ рдХреЛ 8443 рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рдЯреЙрдордХреИрдЯ рд╕реБрдиреЗрдВрдЧреЗред
define dnat ($protocol, $from, $to) { exec { 'dnat-$protocol-$from-$to': command => "/sbin/iptables -t nat -A PREROUTING -d $hostname -p $protocol --dport $from -j DNAT --to-destination $to \ && /sbin/iptables -t nat -A OUTPUT -d $hostname -p $protocol --dport $from -j DNAT --to-destination $to ", require => Exec['minimal-firewall'], } }
рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
node 'app' { allowport { https: protocol => tcp, port => 443, } allowport { tomcat: protocol => tcp, port => 8443, } dnat { java: protocol => tcp, from => 443, to => ':8443', } include firewall }
рдХрдВрдкрдиреА рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдорд╛рдИрд╕реНрдХреНрд▓ рд╕рд░реНрд╡рд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрдЪрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдВ:
define dmzport ($protocol, $port) { exec { 'dmz-$protocol-$port': command => "/sbin/iptables -I INPUT 7 -s admin.example.com -p $protocol --dport $port -j ACCEPT \ && /sbin/iptables -I INPUT 7 -s www.example.com -p $protocol --dport $port -j ACCEPT \ && /sbin/iptables -I INPUT 7 -s mysql.example.com -p $protocol --dport $port -j ACCEPT \ && /sbin/iptables -I INPUT 7 -s app.example.com -p $protocol --dport $port -j ACCEPT", require => Exec['minimal-firewall'], } }
рдЕрдм mysql рдиреЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди:
node 'mysql' { dmzport { mysql: protocol => tcp, port => 3306, } include firewall }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдХрдВрдкрдиреА рдХреЗ рд╕рднреА рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХреЗрдВрджреНрд░реАрдХреГрдд рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдорд┐рд▓рд╛ред