2017-12-14 2 views
1

솔트 스탁으로 유연한 iptables 관리 솔루션을 구성하려고하는데, 생각보다 어렵습니다.SaltStack을 사용한 IPtables 관리

내 주요 요구 사항 : 필자는 IP 목록을 유지하는 기둥을 가질 수 있어야하며 모든 미니언에서 SSH 액세스를 허용해야합니다. 이 IP 목록은 당장 변경 될 것입니다. 일부 IP는 추가되고 일부 IP는 제거됩니다. 내가 직면하고있는 문제는 제거 된 IP에 있습니다. 필자 파일에서 제거하면, SaltStack은 하인들로부터 실제 화이트리스트를 제거하지 않습니다.

내가 찾을 수있는 유일한 해결책은 "removed-ips"라는 새 키를 만드는 것이었고 IP를 제거 할 때마다 추가했습니다. 두 번째 for 루프는이를 제거합니다. 물론, 이것은 정말 불쾌한 해결 방법입니다. 더 좋은 방법이 있습니까?

/srv/pillar/iptables-default.sls :

iptables-default: 
    whitelisted-ips: 
    - '55.55.55.55' 
    - '66.66.66.66' 
    - '77.77.77.77' 
    removed-ips: 
    - '88.88.88.88' 

/srv/salt/iptables-default.sls :

{% for ip in salt['pillar.get']('iptables-default:whitelisted-ips') %} 
Whitelist OSF IP {{ip}} for SSH access: 
    iptables.append: 
    - table: filter 
    - family: ipv4 
    - chain: INPUT 
    - jump: ACCEPT 
    - match: state 
    - connstate: NEW 
    - source: '{{ ip }}' 
    - dport: 22 
    - proto: tcp 
    - save: True 
{% endfor %} 

{% for ip in salt['pillar.get']('iptables-default:removed-ips') %} 
Remove old IPs that are not needed anymore: 
    iptables.delete: 
    - table: filter 
    - family: ipv4 
    - chain: INPUT 
    - jump: ACCEPT 
    - match: state 
    - connstate: NEW 
    - source: {{ ip }} 
    - dport: 22 
    - proto: tcp 
    - save: True 
{% endfor %} 

답변

1

,이 같은 /etc/iptables/rules.v4 및 V6를 관리하기를 오히려 소금의 iptables에 상태를 사용하는 것보다 :

firewall-ipv4: 
    pkg.installed: 
    - pkgs: 
     - iptables 
     - iptables-persistent 
    file.managed: 
    - name: /etc/iptables/rules.v4 
    - source: salt://firewall/files/rules.jinja 
    - template: jinja 
    - context: 
     slspath: {{ slspath }} 
     family: ipv4 
    cmd.wait: 
    - name: iptables-restore rules.v4 
    - cwd: /etc/iptables 
    - order: last 
    - watch: 
     - file: firewall-ipv4 

{{ similar for v6... }} 

경우 규칙을 .jinja는 기둥에서 규칙 집합을 생성합니다. 이 방법의 이점은 각 주 (state)마다 플러시 (즉, 변경)를하지 않아도 기둥 규칙을 제거 할 때 올바른 작업을 수행한다는 것입니다. 단점은 로컬 시스템에서 방화벽에 대한 수동 변경 사항을 인식하지 못하게됩니다.

나는 here 기술을 사용하는 공식이 있습니다. 호환성 문제에 대한 readme note를 무시하고 현재의 salt에서 잘 작동합니다. 아니면 마지막으로 내가 확인 했어.

1

플러시 모든 규칙에 근거 규칙을 추가하기 전에 기둥 데이터. 따라서 규칙을 추가하는 다른 모든 상태에서이 상태를 플러시하고 필요로하는 상태를 추가하십시오. 이렇게하면 규칙을 추가하기 전에 플러시가 한 번 실행됩니다.

검증되지 않은 예 :

flush_all_rules: 
    iptables.flush: 
    - table: filter 
    - family: ipv4 

{% for ip in salt['pillar.get']('iptables-default:whitelisted-ips') %} 
Whitelist OSF IP {{ip}} for SSH access: 
    iptables.append: 
    - table: filter 
    - family: ipv4 
    # [...] 
    - require: 
     - iptables: flush_all_rules 
{% endfor %} 
관련 문제