ansible安全優化篇

1、安全概況

  對與一臺全新安裝的服務器,尤爲是直接面向公網的服務器來講:最重要的一項配置就是安全配置。php

  針對非受權鏈接和截取通訊信息等攻擊行爲,避免攻擊手段帶來的危害,處理方法有如下方法:mysql

  1. 使用安全加密的通訊方式——使用https加密傳輸;
  2. 禁止root用戶遠程登陸並充分利用sudo;
  3. 移除非必需的軟件,只開發須要用到的端口;
  4. 遵照權限最小化原則;
  5. 及時更新操做系統和軟件——修復舊版本的bug,並使用新版本的最佳性能;
  6. 使用合理配置過的、有針對性的防火牆;
  7. 確保日誌文件被及時遷移、存放和切割;
  8. 監測系統登陸狀況,封掉可疑的IP地址;
  9. 正確使用SELinux和AppArmor。

2、SSH與遠程鏈接簡介

  1、Telnet

  Telnet協議誕生於20世紀60年代後期,最初被應用到基於TCP協議的大型私有網絡之中,默認端口是23號端口。git

  Telnet是一種文本協議,用於在不一樣網絡間傳輸數據。Telnet屬於底層協議,至今它依然是咱們如今使用的不少通訊協議的基礎,好比HTTP、FTP以及POP3。web

  隨着SSH的到來,Telnet開始逐漸退出遠程管理的舞臺。sql

  2、SSH

  SSH(Secure Shell)誕生於1995年,由芬蘭人Tatu Ylonen開發。他看到了文本通訊的安全缺陷,這促使他開發一款強加密的遠程管理工具——SSH。數據庫

  SSH的鏈接加密方式很是相似於HTTP的SSL加密,同時SSH的認證層還增長了更高的安全機制。apache

  

3、通訊加密

  1、爲了保證服務器的安全性,咱們須要:

  1. 禁止SSH基於密碼登陸(禁止密碼登陸以前,務必確認SSH能夠成功祕鑰認證登陸),使用更爲安全的祕鑰認證來加密通訊
  2. 禁止root用戶遠程登陸
  3. 同時改變SSH服務的默認端口號

  2、實現功能

  一、實現sshd_config.yml文件以下

- hosts: example
    tasks:
        - name: 修改SSH配置文件的安全選項
            lineinfile:
            dest: /etc.ssh/sshd_config
            regexp: "{{ item.regexp }}"
            line: "{{ item.line }}"
            state: present
        with_items:
            - {
                regexp: "^PasswordAuthentication",
                line: "PasswordAuthentication no"
            }
            - {
                regexp: "^PermitRootLogin",
                line: "PermitRootLogin no"
            }
            - {
                regexp: "^Port",
                line: "Port 2849"
            }
        notify: restart ssh
    handlers:
        - name: restart ssh
            service: name=ssh state=restarted

  二、實現方法

  使用ansible的linefile模塊對SSH的三大安全配置選項進行設置,隨便使用handler了重啓,來使修改生效。安全

  三、須要注意的點

  若改變了某些Inentory主機的SSH配置,好比更改了默認的端口號,此時咱們須要在ansible的Inventory文件中使用ansible_ssh_port變量明確地爲該主機從新指定新配置的端口號。服務器

4、禁止root遠程登陸

  使用lineinfile模塊來配置SSH徹底禁止使用root用戶遠程登陸。網絡

  1、權限控制簡介

  Linux系統的sudo命令可讓普通用戶以root(也能夠指定爲其餘用戶)的權限來執行指定命令,這樣不只減小了root用戶和管理時間,一樣也提升了安全性。sudo命令能夠在執行敏感的高權限命令時,更加有針對性,從而減小高權限命令誤操做的概率。

  ansible自己也提倡儘可能使用普通用戶來管理主機,只有必須使用root權限的任務中,才使用sudo變量來實現Linux命令行中的sudo功能。

---
    - name: Restart Apache.
        service: name=httpd state=restarted
        sudo: yes

  在任務或playbook中能夠經過添加sudo_user:[username]關鍵字來指定sudo後具體以哪一個用戶的權限來執行操做,而不只僅是root用戶。

  須要注意的是:sudo_user關鍵字必須在有sudo關鍵字的前提下才生效。

  2、ansible將普通用戶提權

  使用ansible修改sudo的配置文件,使普通用戶擁有和root用戶同樣的權限。

  一、實現方式一:使用lineinfile

---
    - name: 爲普通用戶賦予全部root權限
        lineinfile:
            dest: /etc/sudoers
            regexp: '^%wzs'
            line: 'wzs ALL=(All) NOPASSWD: ALL'
            state: present

  使用lininfile模塊操做可能達不到預期的效果。因此使用這種方式時,應該認真檢查,確保修改後語法的正確性。

  更好的更改方式是遠程執行visudo命令,更改sudo命令,並防止錯誤修改形成命令的不可用。

  二、實現方式二:ansible主機修改sudo配置文件,使用visudo命令

---

    - name: Copy validated sudoers file into place.
        copy:
            src: sudoers
            dest: /etc/sudoers
            validate: 'visudo -cf %s'

  %s是一個文件路徑的佔位符,在文件被複制到遠程主機以前,他會被替換爲src後面的文件。

5、操做系統簡介

  1、未使用配置文件管理工具的痛點

   在配置文件管理工具流行以前,服務器常常會殘留一些再也不使用的軟件服務,以及這些服務所使用的端口。這不只使服務器變得緩慢臃腫,同時這些開放的端口和老舊的軟件都易受到外部攻擊,形成潛在風險。

  及時關閉服務器上再也不須要的服務,卸載不相關的軟件,並清理再也不須要執行crontab任務,這不只能夠幫助服務器「瘦身」,還能夠提升服務器的安全性。

  2、使用ansible配置管理

  使用ansible來管理維護服務器架構,上面的痛點輕鬆解決。

  一、解決方式:

  1. 使用事先寫好的Playbook或Role快速地部署一臺全新的服務器來取代舊服務器。
  2. 簡單地列出一個須要刪除的軟件列表,利用ansible進行批量卸載。

  二、使用ansible批量卸載不須要的軟件

---
    - name: 卸載不須要的軟件
        yum: name={{ item }} state=absent purge=yes
        with_items:
            - apache2
            - nano
            - php

  注意:state不一樣選項的區別

  1. present,installed是安裝套件,而latest則是指安裝最新的套件,也就是會使用 yum mirror 上最新的版本。
  2. absent, removed 是刪除套件,沒有什麼區別

  三、ansible批量操做

    一、服務、文件

  在ansible中,像yum、apt、file、mysql_db這些模塊,他們都有一個相同的選項state,設置其值爲absent,能夠將指定的任務軟件、文件或者數據庫刪除掉。妥善利用這些功能,能夠大大提升運維人員的工做效率,節省大量時間。

    二、端口

  只開放須要用到的端口,關閉哪些無關緊要的端口,將大大減小外部環境對主機的攻擊面,同時也會下降防火牆的複雜度。

  舉例:不加任何限制就對外開放25端口會給外部網絡提供大量的主機信息。因此。若你的主機不是一臺SMTP服務器的話,務必關閉這個端口。同時,也要確保哪些須要被開啓的端口,只能鏈接依賴的客戶端。

6、遵照權限最小化原則

  生產環境中,主機上的全部用戶、應用以及進程都應該只容許訪問他們自己須要訪問的信息(文件)和資源(內存、網絡等)——一點也很少,一點也很多

  在權限最小化原則實施的過程當中,最直接的也是最基本的兩個方向:用戶權限管理和文件權限管理。

  1、用戶管理

  系統上的每個新增用戶的權限默認都是被適當限制過的。新增用戶一般都有一個家目錄,且用戶對家目錄下的全部文件和目錄具備最搞權限,可是對於家目錄之外的目錄與文件的權限都須要從新賦予。

  爲用戶新增權限的方法有兩種

  1. 添加用戶到其餘用戶組中,已繼承該用戶組的權限
  2. 爲用戶開放sudo權限,使得其能夠以root或者其餘用戶的身份來執行命令或者訪問文件

   2、文件權限管理

  ansible中每個與文件管理相關的模塊中都有文件權限管理的選項可用,這些選項包括:owner、group和mode。每一次使用copy、template、file等模塊來操做管理文件時,都應該使用這些選項來明確指定文件的權限及其歸屬。

  一、實踐:gitlab的配置文件應該只能被root用戶讀取和修改,其餘任何用戶都沒有權限

---
    - name: 設置gitlab配置文件的權限
        file:
            path: /etc/gitlab/gitlab.rb
            owner: root
            group: root
            mode: 0600

  二、配置文件或者目錄權限

  爲了知足用戶對某些文件或目錄的權限需求,正確的作法是修改文件或目錄的權限來適應用戶,而不是擴大用戶權限來獲得某些權限的知足。

  例如:web服務器上httpd用戶或者Nginx用戶對網站文件擁有權限。

7、按期維護更新

  服務器每年全部軟件的安全更新有上百次甚至更多。其中有一些是針對修復對系統有嚴重威脅的漏洞的,若這些漏洞沒有及時更新軟件或打相應的補丁,將會對系統安全形成嚴重威脅。

  應該按期進行補丁維護和軟件更新檢查。在對線上生產服務器上的軟件打補丁或者更新升級以前,應該在非關鍵服務器或環境相同的測試服務器上進行測試,在肯定沒問題的狀況下再對線上生產服務器進行操做。

  1、手動更新

  使用ansible命令對服務器上全部軟件更新升級操做。

  然而,在有些狀況下咱們只需實施與安全相關的更新,或者只更新某些軟件;在仍須要使用這兩個命令的前提下,能夠經過修改yum軟件和apt軟件的配置文件來進行定義。

  一、對於RedHat和CentOS等系統來講,使用以下命令

ansible webservers -m yum -a "name=* state=latest"

  二、對於Debian和Ubuntu等系統來講,使用以下命令

ansible webservers -m apt -a "upgrade=dist update_cache=yes"

  2、自動定時更新

  能夠在系統上設置天天或每週定時進行軟件更新,這樣可使系統更新這一動做更穩定、更有規律地執行下去,從而減小人力成本。

  但在現實中,有些環境是不容許機器自動更新軟件的,由於自動更新自己蘊含着一些風險。好比:有些軟件的最新版確實修正了以前版本的一些不足,可是它的新增功能可能與系統上本身開發的一些程序的兼容性不足,從而使得整個系統不可用。

  若你的系統上不存在這些問題,那麼使用自動定時更新軟件,能夠更進一步增長系統安全性。

  一、自動更新RedHat系統上的軟件

  對於RedHat 6及其之後的版本的系統(包括Fedora和CentOS)均可以使用一個叫YUM-cron的軟件進行軟件包更新管理。其用法很簡單,使用yum安全後,保證開機開啓就能夠了。使用ansible來實現以下便可

---
    - name: 安裝yum-cron
        yum: name=yum-cron state=present
    
    - name: 運行yum-cron並設置開機啓動
        services: name=yum-cron state=started enabled=yes

  更多的配置能夠經過修改yum的配置文件/etc/yum.conf

  二、自動更新Debian系統上的軟件

  Debian系統及其衍生版都使用一款名叫unattended-upgrades的軟件來實現自動化軟件包更新管理,這款軟件和前面講的YUM-cron同樣,很是便於安裝和配置,而且支持多配置文件,存放於/etc/apt/apt.conf.d/。

---
    - name: 安裝unattended-upgrades
        apt: name=unattended-upgrades state=present

    - name: 將配置文件複製到配置目錄中
        template:
            src: "../templates/{{ item }}.j2"
            dest: "/etc/apt/apt.conf.d/{{ item }}"
            owner: root
            group: root
            mode: 0644
        with_items:
            - 10periodic
            - 50unattended-upgrades

  複製unattended-upgrades配置文件中10periodic的內容以下

APT::Periodic::Update-Package-Lists "1";            //顯示更新包列表,0表示停用設置
APT::Periodic::Download-Upgradeable-Packages  "1";  //下載更新包,0表示停用設置
APT::Periodic::AutocleanInterval "7";               //7天自動刪除
APT::Periodic::Unattended-Upgrade "1";              //啓動自動更新,0表示停用自動更新

  配置文件50unattended-upgrades的內容以下

Unattended-Upgrade::Automatic-Reboot "false";

Unattended-Upgrade::Allowed-Origins {
    "Ubuntu lucid-security";
    "Ubuntu lucid-updates; 
};

  這個配置文件提供了更新配置選項,好比對於那些更新後須要重啓服務器才能生效的軟件,在更新過這些軟件後,是否自動重啓服務器,以及在檢查更新軟件,須要檢測那些APT源來查找更新等。

8、iptables防火牆

  管理防火牆的工具,好比iptables、ufw以及firewalld等。

  1、在Debian及衍生系統,ansible的ufw模塊來完成

  使用ansible開關閉Debian系統中除了22(SSH)、80(HTTP)、123(NTP)端口之外的其餘的全部端口。

  一、代碼實現

---
    - name: 使用ufw模塊來管理那些端口須要開啓
        ufw:
            rule: "{{ item.rule }}"
            port: "{{ item.port }}"
            proto: "{{ item.proto }}"
        with_item:
            - { rule: 'allow', port: 22, proto: 'tcp' }
            - { rule: 'allow', port: 80, proto: 'tcp' }
            - { rule: 'allow', port: 123, proto: 'ucp' }
    - name: 配置網絡進出方向的默認規則
        ufw:
            direction: "{{ item.direction }}"
            policy: "{{ item.policy }}"
            state: enabled
        with_items:
            - { direction: outgoing, policy: allow }
            - { direction: incoming, policy: deny }

  二、上面playbook任務運行以後,登陸對方主機,使用sudo ufw status verbose命令

  2、在RedHat及其衍生系統中,咱們使用ansible的firewalld模塊來管理防火牆

   一、代碼實現

---
    - name: 使用firewalld模塊管理端口
        firewalled:
            state: "{{ item.state }}"
            port: "{{ item.port }}"
            zone: external
            immediate: yes
            permanent: yes
        with_items:
            - { state: 'enabled', port: '22/tcp' }
            - { state: 'enabled', port: '80/tcp' }
            - { state: 'enabled', port: '123/ucp' }

  注意:

  一、immediate選項從ansible版本1.9以外開始引入,用來定義規則在配置完成是否當即生效。若使用的是1.9以前的版本的,那麼須要重啓防火牆來讓新規則生效,或者將permanent選項的值設爲no。

  二、firewalld模塊並不能針對網絡進出口方向進行管理,可是咱們能夠藉助iptables模塊或者直接修改/etc/firewalld目錄下的防火牆配置文件來進行配置。

  二、查看被放行的端口

sudo firewall-cmd --zone=external --list-all
相關文章
相關標籤/搜索