對與一臺全新安裝的服務器,尤爲是直接面向公網的服務器來講:最重要的一項配置就是安全配置。php
針對非受權鏈接和截取通訊信息等攻擊行爲,避免攻擊手段帶來的危害,處理方法有如下方法:mysql
Telnet協議誕生於20世紀60年代後期,最初被應用到基於TCP協議的大型私有網絡之中,默認端口是23號端口。git
Telnet是一種文本協議,用於在不一樣網絡間傳輸數據。Telnet屬於底層協議,至今它依然是咱們如今使用的不少通訊協議的基礎,好比HTTP、FTP以及POP3。web
隨着SSH的到來,Telnet開始逐漸退出遠程管理的舞臺。sql
SSH(Secure Shell)誕生於1995年,由芬蘭人Tatu Ylonen開發。他看到了文本通訊的安全缺陷,這促使他開發一款強加密的遠程管理工具——SSH。數據庫
SSH的鏈接加密方式很是相似於HTTP的SSL加密,同時SSH的認證層還增長了更高的安全機制。apache
- 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變量明確地爲該主機從新指定新配置的端口號。服務器
使用lineinfile模塊來配置SSH徹底禁止使用root用戶遠程登陸。網絡
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關鍵字的前提下才生效。
使用ansible修改sudo的配置文件,使普通用戶擁有和root用戶同樣的權限。
--- - name: 爲普通用戶賦予全部root權限 lineinfile: dest: /etc/sudoers regexp: '^%wzs' line: 'wzs ALL=(All) NOPASSWD: ALL' state: present
使用lininfile模塊操做可能達不到預期的效果。因此使用這種方式時,應該認真檢查,確保修改後語法的正確性。
更好的更改方式是遠程執行visudo命令,更改sudo命令,並防止錯誤修改形成命令的不可用。
--- - name: Copy validated sudoers file into place. copy: src: sudoers dest: /etc/sudoers validate: 'visudo -cf %s'
%s是一個文件路徑的佔位符,在文件被複制到遠程主機以前,他會被替換爲src後面的文件。
在配置文件管理工具流行以前,服務器常常會殘留一些再也不使用的軟件服務,以及這些服務所使用的端口。這不只使服務器變得緩慢臃腫,同時這些開放的端口和老舊的軟件都易受到外部攻擊,形成潛在風險。
及時關閉服務器上再也不須要的服務,卸載不相關的軟件,並清理再也不須要執行crontab任務,這不只能夠幫助服務器「瘦身」,還能夠提升服務器的安全性。
使用ansible來管理維護服務器架構,上面的痛點輕鬆解決。
--- - name: 卸載不須要的軟件 yum: name={{ item }} state=absent purge=yes with_items: - apache2 - nano - php
注意:state不一樣選項的區別
在ansible中,像yum、apt、file、mysql_db這些模塊,他們都有一個相同的選項state,設置其值爲absent,能夠將指定的任務軟件、文件或者數據庫刪除掉。妥善利用這些功能,能夠大大提升運維人員的工做效率,節省大量時間。
只開放須要用到的端口,關閉哪些無關緊要的端口,將大大減小外部環境對主機的攻擊面,同時也會下降防火牆的複雜度。
舉例:不加任何限制就對外開放25端口會給外部網絡提供大量的主機信息。因此。若你的主機不是一臺SMTP服務器的話,務必關閉這個端口。同時,也要確保哪些須要被開啓的端口,只能鏈接依賴的客戶端。
生產環境中,主機上的全部用戶、應用以及進程都應該只容許訪問他們自己須要訪問的信息(文件)和資源(內存、網絡等)——一點也很少,一點也很多。
在權限最小化原則實施的過程當中,最直接的也是最基本的兩個方向:用戶權限管理和文件權限管理。
系統上的每個新增用戶的權限默認都是被適當限制過的。新增用戶一般都有一個家目錄,且用戶對家目錄下的全部文件和目錄具備最搞權限,可是對於家目錄之外的目錄與文件的權限都須要從新賦予。
爲用戶新增權限的方法有兩種
ansible中每個與文件管理相關的模塊中都有文件權限管理的選項可用,這些選項包括:owner、group和mode。每一次使用copy、template、file等模塊來操做管理文件時,都應該使用這些選項來明確指定文件的權限及其歸屬。
--- - name: 設置gitlab配置文件的權限 file: path: /etc/gitlab/gitlab.rb owner: root group: root mode: 0600
爲了知足用戶對某些文件或目錄的權限需求,正確的作法是修改文件或目錄的權限來適應用戶,而不是擴大用戶權限來獲得某些權限的知足。
例如:web服務器上httpd用戶或者Nginx用戶對網站文件擁有權限。
服務器每年全部軟件的安全更新有上百次甚至更多。其中有一些是針對修復對系統有嚴重威脅的漏洞的,若這些漏洞沒有及時更新軟件或打相應的補丁,將會對系統安全形成嚴重威脅。
應該按期進行補丁維護和軟件更新檢查。在對線上生產服務器上的軟件打補丁或者更新升級以前,應該在非關鍵服務器或環境相同的測試服務器上進行測試,在肯定沒問題的狀況下再對線上生產服務器進行操做。
使用ansible命令對服務器上全部軟件更新升級操做。
然而,在有些狀況下咱們只需實施與安全相關的更新,或者只更新某些軟件;在仍須要使用這兩個命令的前提下,能夠經過修改yum軟件和apt軟件的配置文件來進行定義。
ansible webservers -m yum -a "name=* state=latest"
ansible webservers -m apt -a "upgrade=dist update_cache=yes"
能夠在系統上設置天天或每週定時進行軟件更新,這樣可使系統更新這一動做更穩定、更有規律地執行下去,從而減小人力成本。
但在現實中,有些環境是不容許機器自動更新軟件的,由於自動更新自己蘊含着一些風險。好比:有些軟件的最新版確實修正了以前版本的一些不足,可是它的新增功能可能與系統上本身開發的一些程序的兼容性不足,從而使得整個系統不可用。
若你的系統上不存在這些問題,那麼使用自動定時更新軟件,能夠更進一步增長系統安全性。
對於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系統及其衍生版都使用一款名叫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源來查找更新等。
管理防火牆的工具,好比iptables、ufw以及firewalld等。
使用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 }
--- - 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