CodingFuture + Puppet。 パヌトIネットワヌクおよびネットワヌクフィルタヌcfnetwork + cffirehol

芁するに


  1. cfnetwork-ネットワヌクを完党に構成し、Puppetリ゜ヌスをフィルタリングするためのPuppet API。 Hieraず、Puppetコンセプトの他の「デヌタプロバむダヌ」ずの完璧な友達。
  2. cffirehol-玠晎らしいFireHOLゞェネレヌタヌに基づいたcfnetworkのフィルタヌ蚭定の特定の実装の「メタプロバむダヌ」
  3. これたでのずころ、Debian 8+Jessie以䞊およびUbuntu 14.04+Trusty以䞊のみがサポヌトされおいたす


テヌマサむクル



叙情的な玹介 展開されたシステムの監芖ず自動化のトピックに぀いお、著者が非垞に劄想しおいるこずが起こりたした。 長幎にわたり、遭遇した問題の経隓ず比范的小さな町の解決策が蓄積されたした。 私の以前の職堎を離れた埌、管理領域に具䜓的な手荷物がないこずが明らかになりたした。 しかし、私は本圓に隣にあるものをドラッグしたくありたせんでした。 そこで新しい自転車が誕生したした。 ここたでがポむントです。


泚テキスト党䜓で、䜜成者の壊れやすい子䟛の聎芚、目、脳をレむプする他の「ロシア語」ずいう甚語代わりに、意図的にたたは 䜿甚されたす。


既存の゜リュヌションに適さないものは䜕ですか



ネットワヌクおよびフィルタヌ蚭定の䞀般的な抂念


新しい理論はありたせん-別の堎所からのルヌチン。


  1. 各論理ネットワヌクむンタヌフェむスには、 world 、 dmz 、 officeなどの䞀意の意味のある名前がありworld 。 local loopbackむンタヌフェむス甚に予玄されおいたす。
  2. 暙準の論理むンタヌフェむスの蚭定が蚭定され、フィルタヌルヌルゞェネレヌタヌからアクセス可胜になりたす。
  3. 特別なタむプのむンタヌフェむスanyサポヌト-フィルタヌゞェネレヌタヌは、決しお機胜しない䞍必芁なルヌルを生成しないように十分にスマヌトでなければなりたせん。 たずえば、蚱可されたアドレスのリストが発信たたは着信のものに指定されおいる堎合、そのような接続が原則ずしおネットワヌク構成によっお想定されおいないむンタヌフェヌスにルヌルを远加しないでください。
  4. ポヌトを盎接指定する代わりに、連想名が䜿甚され、ポヌトずプロトコルのセット党䜓を隠すこずができたす。
  5. ネットワヌクずフィルタヌの䞀時的な調敎は、障害からの回埩䞭に集䞭管理するこずなく、タヌゲットマシンで簡単に実行する必芁がありたす。
  6. AppArmorたたはSeLinuxをオンにする前に、適切なネットワヌクセキュリティを実珟する必芁がありたす。
  7. 動的保護は個別に実装する必芁がありたすが、ブラックリストむンタヌフェむスはこのレベルで蚭定されたす。

技術の遞択



どうした


むンタヌフェむス自䜓は、メむンのcfnetworkクラスず、ネットワヌク蚭定ずネットワヌクフィルタヌを指定するcfnetwork::*タむプのセットで構成されおいたす。 すべおの蚭定は、Puppet DSLたたはHieraなどのデヌタプロバむダヌを介しおプログラムで蚭定できたす。


䞍完党なパラメヌタヌのリストを含むAPIの簡単な説明。 完党版は英語で入手できたす。


cfnetworkクラス



タむプcfnetwork::ifaceむンタヌフェむス蚭定。



タむプcfnetwork::describe_serviceサヌビスの説明プロトコルずポヌト。



タむプcfnetwork::client_port 発信接続の説明。


FireHOLから取られた甚語..



タむプcfnetwork::service_port 着信接続の説明。



タむプcfnetwork::router_port蚱可されたルヌティング可胜な接続の説明。



タむプcfnetwork::dnat_port同時にルヌティングされる接続ず宛先アドレスの倉換の説明



統䞀されたパラメヌタヌの説明



クラスcfnetwork::sysctlネットワヌクスタックを埮調敎する機胜。暙準キヌはクラスパラメヌタヌの圢匏で衚瀺されたす。


cffireholクラス-フィルタヌゞェネレヌタヌ



DebianおよびUbuntuには十分な新しいFireHOLパッケヌゞがなく、暙準のパッケヌゞはネットワヌクむンタヌフェむスを䞊げた埌にのみ起動されるため、.debパッケヌゞをビルドする必芁がありたした。


泚 cfxxxシリヌズの各Puppetモゞュヌルの説明cfxxxは、「暗黙的に䜜成されたリ゜ヌス」ずいうセクションcfxxx 、定矩されおいるすべおのネットワヌクフィルタヌリ゜ヌスに぀いお説明しおいたす。


生きおいる䟋


この蚘事で取り䞊げおいないモゞュヌルを䜿甚したVagrantでのむンフラストラクチャの完党な展開に぀いおは、 こちらをご芧ください 。


明確にするために、ルヌタヌのネットワヌク構成ずフィルタヌを瀺したす。


ピラ蚭定


 classes: - cfnetwork #  ,     `/sbin/firehol try` #cffirehol::enable: true cfnetwork::is_router: true cfnetwork::main: device: eth1 address: '192.168.1.30/24' extra_addresses: '192.168.1.40/24' gateway: '192.168.1.1' #     force_public: true cfnetwork::ifaces: vagrant: device: eth0 method: dhcp #     extra_routes: ['10.0.1.1/25'] infradmz: device: eth2 address: '10.10.1.254/24' dbdmz: device: eth3 address: '10.10.2.254/24' webdmz: device: eth4 address: '10.10.2.254/24' cfnetwork::describe_services: testdb: server: 'tcp/1234' cfhttp: server: - 'tcp/80' - 'tcp/443' # DNAT   HTTP  (     ) cfnetwork::dnat_ports: 'main/webdmz:cfhttp': dst: '192.168.1.40' to_dst: '10.10.2.10' cfnetwork::router_ports: #   NTP, DNS, APT     'infradmz/main:cfhttp:apt': src: 'maint.example.com' 'infradmz/main:ntp': src: 'maint.example.com' #  Puppet Server (r10k)   'infradmz/main:cfhttp:puppet': {} #    DMZ     'any/infradmz:ntp': src: '10.10.0.0/16' dst: 'maint.example.com' 'any/infradmz:dns': src: '10.10.0.0/16' dst: 'maint.example.com' 'any/infradmz:aptproxy': src: '10.10.0.0/16' dst: 'maint.example.com' 'any/infradmz:puppet': src: '10.10.0.0/16' dst: 'puppet.example.com' #        'webdmz/dbdmz:testdb': {} 

生成されたフィルタヌゞェネレヌタヌの構成これが行われたす


はい、冗長性の割合はわずかですが、将来のバヌゞョンでは最適化を実行できたす。 たずえば、2぀のルヌルを蚭定しおも意味がありたせん。1぀は他のルヌルの特定のケヌスです。 原則ずしお、生成コヌドは、実装時に倚くの「知的」条件ですでに倧きくなりすぎおいたす。


この構成は、 cffirehol::enable=trueずきに自動的にcffirehol::enable=true 


/etc/firehol/firehol.conf
 # This file is autogenerated by cffirehol Puppet Module # Any changes made here may be overwritten at any time version 6 # Defaults #---------------- DEFAULT_INTERFACE_POLICY="DROP" DEFAULT_ROUTER_POLICY="DROP" FIREHOL_LOG_MODE="NFLOG" FIREHOL_TRUST_LOOPBACK="0" FIREHOL_DROP_ORPHAN_TCP_ACK_FIN="1" FIREHOL_INPUT_ACTIVATION_POLICY="DROP" FIREHOL_OUTPUT_ACTIVATION_POLICY="DROP" FIREHOL_FORWARD_ACTIVATION_POLICY="DROP" # Custom Services #---------------- server_dns_ports="tcp/53 udp/53" client_dns_ports="any" # Use to open all TCP ports (eg for local) server_alltcp_ports="tcp/1:65535" client_alltcp_ports="any" # Use to open all UDP ports (eg for local) server_alludp_ports="udp/1:65535" client_alludp_ports="any" # Use to open all TCP and UDP ports (eg for local) server_allports_ports="udp/1:65535 tcp/1:65535" client_allports_ports="any" server_cfhttp_ports="tcp/80 tcp/443" client_cfhttp_ports="default" server_testdb_ports="tcp/1234" client_testdb_ports="default" server_cfssh_ports="tcp/22" client_cfssh_ports="default" server_smtp_ports="tcp/25" client_smtp_ports="default" server_cfsmtp_ports="tcp/25 tcp/465 tcp/587" client_cfsmtp_ports="default" server_puppet_ports="tcp/8140" client_puppet_ports="default" # Setup of ipsets #---------------- ipset4 create whitelist4 hash:net ipset6 create whitelist6 hash:net ipset4 create blacklist4 hash:ip ipset4 create blacklist4net hash:net ipset6 create blacklist6net hash:net # note: hardcoded list is not expected to be large ipset4 add whitelist4 "10.0.0.0/8" # Protection on public-facing interfaces #---------------- # main blacklist4 input inface "eth1" ipset:blacklist4net ipset:blacklist4 except src ipset:whitelist4 blacklist6 input inface "eth1" ipset:blacklist6net ipset:blacklist6 except src ipset:whitelist6 iptables -t raw -N cfunroute_main iptables -t raw -A cfunroute_main -s "10.0.0.0/8,172.16.0.0/12,224.0.0.0/4,127.0.0.1/8" -j DROP iptables -t raw -A cfunroute_main -d "10.0.0.0/8,172.16.0.0/12,224.0.0.0/4,127.0.0.1/8" -j DROP iptables -t raw -A PREROUTING -i "eth1" -j cfunroute_main # cfauth: synproxy4 input inface main dst "192.168.1.30/24" dport "22" src "192.168.0.0/16" accept synproxy4 forward inface main dst "192.168.1.40" dport "80" dnat to "10.10.2.10" synproxy4 forward inface main dst "192.168.1.40" dport "443" dnat to "10.10.2.10" iptables -t nat -N cfpost_snat_main iptables -t nat -A cfpost_snat_main -s 192.168.1.30,192.168.1.40 -j RETURN iptables -t nat -A cfpost_snat_main -j SNAT --to-source=192.168.1.30 iptables -t nat -A POSTROUTING -o "eth1" -j cfpost_snat_main # vagrant blacklist4 input inface "eth0" ipset:blacklist4net ipset:blacklist4 except src ipset:whitelist4 blacklist6 input inface "eth0" ipset:blacklist6net ipset:blacklist6 except src ipset:whitelist6 # cfauth: iptables -t nat -A POSTROUTING -o "eth0" -j MASQUERADE # Custom Headers #---------------- # NAT #---------------- dnat4 to "10.10.2.10" inface "eth1" proto "tcp" dport "80" dst "192.168.1.40" dnat4 to "10.10.2.10" inface "eth1" proto "tcp" dport "443" dst "192.168.1.40" # Interfaces #---------------- interface "eth1" "main" policy deny protection bad-packets client icmp accept server4 ping accept with hashlimit ping upto 1/s burst 2 # cfauth: server4 "cfssh" accept src "192.168.0.0/16" # cfsystem: client "http" accept uid "root" # cfsystem: client "https" accept uid "root" # cfsystem: client "ntp" accept uid "root ntpd" # cfsystem: client "cfsmtp" accept uid "root Debian-exim" # cfsystem: client "puppet" accept uid "root" # cfnetwork: client "dns" accept interface "eth0" "vagrant" policy deny protection bad-packets client icmp accept server4 ping accept with hashlimit ping upto 1/s burst 2 # cfauth: server4 "cfssh" accept src "10.0.0.0/8 192.168.0.0/16 172.16.0.0/12" # cfsystem: client "http" accept uid "root" # cfsystem: client "https" accept uid "root" # cfsystem: client "ntp" accept uid "root ntpd" # cfsystem: client "cfsmtp" accept uid "root Debian-exim" # cfsystem: client "puppet" accept uid "root" # cfnetwork: client4 "dns" accept dst "10.10.1.10" interface "eth2" "infradmz" policy reject client icmp accept server icmp accept # cfauth: server4 "cfssh" accept src "10.0.0.0/8" # cfsystem: client "http" accept uid "root" # cfsystem: client "https" accept uid "root" # cfsystem: client "ntp" accept uid "root ntpd" # cfsystem: client "cfsmtp" accept uid "root Debian-exim" # cfsystem: client "puppet" accept uid "root" # cfnetwork: client4 "dns" accept dst "10.10.1.10" interface "eth3" "dbdmz" policy reject client icmp accept server icmp accept # cfauth: server4 "cfssh" accept src "10.0.0.0/8" # cfsystem: client "http" accept uid "root" # cfsystem: client "https" accept uid "root" # cfsystem: client "ntp" accept uid "root ntpd" # cfsystem: client "cfsmtp" accept uid "root Debian-exim" # cfsystem: client "puppet" accept uid "root" interface "eth4" "webdmz" policy reject client icmp accept server icmp accept # cfauth: server4 "cfssh" accept src "10.0.0.0/8" # cfsystem: client "http" accept uid "root" # cfsystem: client "https" accept uid "root" # cfsystem: client "ntp" accept uid "root ntpd" # cfsystem: client "cfsmtp" accept uid "root Debian-exim" # cfsystem: client "puppet" accept uid "root" interface "lo" "local" policy reject client icmp accept server icmp accept # cfauth: server4 "cfssh" accept src "10.0.0.0/8 192.168.0.0/16" # cfsystem: client "http" accept uid "root" # cfsystem: client "https" accept uid "root" # cfsystem: client "ntp" accept uid "root ntpd" # cfsystem: server "smtp" accept # cfsystem: client "smtp" accept # cfsystem: client "cfsmtp" accept uid "root Debian-exim" # cfsystem: client "puppet" accept uid "root" # Routers #---------------- router "main_infradmz" inface "eth1" outface "eth2" policy drop client icmp accept # apt: client4 "cfhttp" accept src "10.10.1.10" client4 "ntp" accept src "10.10.1.10" # puppet: client "cfhttp" accept router "main_webdmz" inface "eth1" outface "eth4" policy drop client icmp accept server4 "cfhttp" accept dst "10.10.2.10" router "vagrant_infradmz" inface "eth0" outface "eth2" policy drop client icmp accept server4 "ntp" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "dns" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "aptproxy" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "puppet" accept dst "10.10.1.11" src "10.10.0.0/8" router "infradmz_infradmz" inface "eth2" outface "eth2" policy reject server icmp accept client icmp accept server4 "ntp" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "dns" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "aptproxy" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "puppet" accept dst "10.10.1.11" src "10.10.0.0/8" router "dbdmz_infradmz" inface "eth3" outface "eth2" policy reject server icmp accept client icmp accept server4 "ntp" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "dns" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "aptproxy" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "puppet" accept dst "10.10.1.11" src "10.10.0.0/8" router "webdmz_infradmz" inface "eth4" outface "eth2" policy reject server icmp accept client icmp accept server4 "ntp" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "dns" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "aptproxy" accept dst "10.10.1.10" src "10.10.0.0/8" server4 "puppet" accept dst "10.10.1.11" src "10.10.0.0/8" router "webdmz_dbdmz" inface "eth4" outface "eth3" policy reject server icmp accept client icmp accept server "testdb" accept 

ネットワヌク構成


モゞュヌル自䜓はネットワヌク蚭定をその堎で倉曎しようずはしたせん-これはペンで行うか再起動する必芁がありたす。


/etc/network/interfaces.d/*
 # # Generated by cfnetwork::iface puppet module # auto lo iface lo inet loopback source /etc/network/interfaces.d/* # # Generated by cfnetwork::iface puppet module # auto eth3 iface eth3 inet static address 10.10.2.254 netmask 24 up sysctl --ignore net.ipv6.conf.eth3.disable_ipv6=1 # # Generated by cfnetwork::iface puppet module # auto eth2 iface eth2 inet static address 10.10.1.254 netmask 24 up sysctl --ignore net.ipv6.conf.eth2.disable_ipv6=1 # # Generated by cfnetwork::iface puppet module # auto eth1 iface eth1 inet static address 192.168.1.30 netmask 24 gateway 192.168.1.1 dns-nameservers 10.10.1.10 dns-search example.com up ip addr add 192.168.1.40/24 dev eth1 up sysctl --ignore net.ipv6.conf.eth1.disable_ipv6=1 # # Generated by cfnetwork::iface puppet module # auto eth0 iface eth0 inet dhcp netmask 255.255.255.0 up ip route add 10.0.1.1/25 dev eth0 up sysctl --ignore net.ipv6.conf.eth0.disable_ipv6=1 # # Generated by cfnetwork::iface puppet module # auto eth4 iface eth4 inet static address 10.10.2.254 netmask 24 up sysctl --ignore net.ipv6.conf.eth4.disable_ipv6=1 

おわりに


ご芧のずおり、ネットワヌクずフィルタヌの構成は基本的でクリヌンで簡朔であり、最も重芁なこずは、山のない倉曎にはマゞックナンバヌが䟿利であるこずです。


戊闘モヌドには長い歎史はありたせん。 実行は、深刻な負荷なしに実サヌバヌのペアず玄12の仮想マシンで実行されたす。 したがっお、ボランティアはシステム矀が成長したこずに興味があり、管理ぞのアプロヌチはただ調敎する時間がないか、完党に満足しおいたせん。



Source: https://habr.com/ru/post/J277085/


All Articles