2015年10月14日 星期三

[Centos7] 新的防火牆firewalld


以下文章轉自 http://note.tc.edu.tw/932.html

什麼?我在新裝的Centos7中竟然沒有找到iptables以及ip6tables,我直覺的想:應該是要自己安裝吧。不過事實上,我發現開的通訊埠都連不上,以為是selinux的問題,結果才知道,Centos7的防火牆是我好像聽過事實上是沒聽過的firewalld (呃,取這個名字?會不會太貼切了~~)
系統 CentOS Linux release 7.0.1406 (Core)

firewalld 執行指令
啟動
# service firewalld start
停止
# service firewalld stop
重新啟動
# service firewalld restart
重讀設定
# firewall-cmd --reload

查看狀態
# service firewalld status

# firewall-cmd --state
程式設定
目錄 /etc/firewalld
設定檔 /etc/firewalld/firewalld.conf
防火牆基礎操作
畢竟他是一個防火牆,所以他引入了防火牆的zone的觀念,一看到就能瞭,一個zone可以有規則,zone到zone也可以有規則。
預設是一個叫 public的 zone,就是外面進到伺服器的zone,如果伺服器很單純對外服務不當路由器的話,這個zone就夠了。
操作這個防火牆如果有圖形介面直接在選單中點選防火牆就好了,圖形化易學易懂較沒問題,指令的話主要是用firewall-cmd 這個指令。
查看zone
# firewall-cmd --get-default-zone
public
查看運作中的zone和zone裡的介面
# firewall-cmd --get-active-zones
public
  interfaces: ens192
可以看到ens192這個介面是在public 這個zone中。
查看此zone所開的服務
# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: ens192
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:


在public zone新增80TCP的服務
# firewall-cmd --zone=public --add-port=80/tcp
移除在public zone上80埠的所有服務 tcp/udp
# firewall-cmd --zone=public --remove-port=80
上面移除新增port(或服務)是整個zone都生效(一個zone可以由很多interfaces組成),我們可以指定來源:
# firewall-cmd --zone=public  --add-source=163.17.40.0/24
# firewall-cmd --zone=public  --remove-source=163.17.40.0/24
這樣是所有的服務都套用這個來源,如果要限定單一服務的來源,可以使用他的rich rules:
列出所有rich-rules
# firewall-cmd --zone=public --list-rich-rules
<預設是沒有>
新增接受限制40.0可以讀取 28001埠
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="163.17.40.0/24" port port="28001" protocol="tcp" accept'
查看設定結果
# firewall-cmd  --zone=public --list-all
public (default, active)
  interfaces: ens192
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:

  rich rules:
rule family="ipv4" source address="163.17.40.0/24" port port="28001" protocol="tcp" accept

這樣子就開通了40.0/24連往這台機器的規則。
但是這樣子設定只是runtime的環境有用,一設定下去就生效,不需要重啟和重讀;
當 firewalld重啟或重讀時,剛才加的設定就不見了,所以上面的操作要全部加上--permanent,讓它變成永久的設定
防火牆永久的設定
查看永久的設定
# firewall-cmd --zone=public --list-all --permanent
查看runtime的設定
# firewall-cmd --zone=public --list-all
在firewalld重啟或重讀時,firewalld會把永久的規則寫到runtime來用。要觀察目前運作中的rule時,切記加上 --permanent

2015年10月13日 星期二

把 SFTP 關起來 (CHROOTED) CentOS 7.1

以下文章摘自http://blog.miniasp.com/post/2011/08/11/OpenSSH-SFTP-chroot-with-ChrootDirectory.aspx


要達到以上需求,我們必須修改 OpenSSH 的設定檔,並且在建立帳號時設定正確的參數,以及建立一個擁有者為 root 的 Chroot 目錄才行,以下是詳細的設定步驟說明:

1. 新增一個 SFTP 專用的群組

在這裡我們先建立一個 sftponly 群組(你當然也可以建立其他的名稱)

groupadd sftponly


2. 修改 OpenSSH 的設定檔

編輯 "/etc/ssh/sshd_config" 檔案,先找到以下 Subsystem 設定:

Subsystem sftp /usr/lib/openssh/sftp-server internal-sftp
並修改成:

Subsystem sftp internal-sftp
然後在該設定檔最後加上以下設定,其中的 ChrootDirectory 設定的 %u 代表使用者帳號:

Match group sftponly
         ChrootDirectory /home/%u
         X11Forwarding no
         AllowTcpForwarding no
         ForceCommand internal-sftp

檢查 sshd_config 內容是否正確
sshd -T

重新啟動 sshd
service sshd restart

3. 建立新使用者,並加入 sftponly 群組

建立新使用者後,預設會建立 /home/USERNAME 家目錄 (Home Directory):

useradd sftpuser
由於我們在 sshd_config 設定檔中有宣告只要符合 sftponly 群組的使用者都套用 ChrootDirectory 的設定,因此必須將該使用者加入到 sftponly 群組中:

useradd -G sftponly sftpuser
另一個重點是,由於要套用 chroot() 的關係,該使用者登入後的根目錄必須擁有一些必要的目錄,為了節省設定上的麻煩,我們只要將該使用者的家目錄修改為根目錄 ( / ) 即可:

usermod -d / sftpuser


4. 修正使用者帳戶的家目錄權限

也是由於 chroot() 的特殊限制,這個要 chroot() 目錄的擁有者必須為 root,而且該目錄的權限也必須設定為 755 才行:

chown root:root /home/sftpuser
chmod 755 /home/sftpuser
這裡沒有設定正確的話將永遠無法成功登入,像我第一次設定時就遇到了以下錯誤: ( /var/log/auth.log )

sshd[8636]: pam_unix(sshd:session): session opened for user sftpuser by (uid=0)
sshd[8707]: fatal: bad ownership or modes for chroot directory "/home/sftpuser"
sshd[8636]: pam_unix(sshd:session): session closed for user


5. 在使用者目錄下建立允許上傳檔案的目錄,並賦予適當的目錄權限

這一個步驟也是蠻重要的,因為 chroot() 過的目錄擁有者必須為 root 且目錄權限為 755,所以使用者登入後一定無法上傳任何檔案到這個目錄,若要讓使用者能上傳檔案,則必須先幫使用者建立好適當的目錄與設定權限才能夠上傳檔案:

cd /home/sftpuser
mkdir upload
chown sftpuser:sftpuser upload
由於該帳戶只需讓使用者上傳檔案,不允許使用者登入使用 shell,所以也建議將一些家目錄內的隱藏檔刪除,以免使用者透過 WinSCP 或 FileZilla Client 登入時看到一些奇怪的檔案。

經過幾個簡單的設定過程,就能夠給客戶使用安全的檔案傳輸功能,又能兼顧開放 SSH 的安全性!

有關 CentOS-7 的問題

CentOS 7 對網路有一些修改,一開始我也找不太到我想要的設定...


以下文章摘自 https://wiki.centos.org/zh-tw/FAQ/CentOS7


有關 CentOS-7 的問題

1. 我過往利用 boot.iso 映像進行網絡安裝。它去了哪裡?

由 EL6 起,上游決定把 boot.iso 移出 images/ 這個目錄並利用另一個獨立的媒體來發行它。基於該映像頗大,我們亦決定同樣做。網絡安裝磁碟的映像名為 netinstall.iso,它只收藏在 isos/ 這個目錄,當中還有其它的安裝映像。

2. 為何我的乙太網絡不能運作,除非我登入並刻意啟用它?

……還有,為甚麼介面名稱完全「逆轉」以往慣例?這樣做違反了 Unix「不更改預期結果」的原則。
上游的預設組態已改用 NetworkManager,而且介面預設是不會被啟用的(針對乙太網來說是較難理解)。權宜之計就是在安裝過程中,等待安裝程式出現詢問語系/鍵盤/儲存裝置/軟件安裝的主頁,然後啟用你的網絡卡。這個晝面內有一粒「網絡及主機名稱」的按鈕。點擊這個按鈕,選取你要編輯的乙太網絡連線,然後點擊右上角的「停用」按鈕。假如你選用 DHCP,你便會看見該連線取得一個網絡位址。如果你需要以手動方式更改網絡設定,請按「設定」按鈕,輸入所需數值並儲存他們。你大概要停用然後再啟用剛設定的網絡卡才能套用這些改動。現在按「完成」便大功告成。你也可以在安裝完成後透過 NetworkManager(「系統;選項;網絡連線」或右按通知區域內的網絡小圖示,選取「編輯連線……」)來作出這些改動。
假如你不採用 NetworkManager,你可以透過編輯網絡介面的設置檔(正常為 /etc/sysconfig/network-scripts/ifcfg-eth0)並把 ONBOOT=no 改為 ONBOOT=yes 來達到相同効果。某些採用 DHCP 的安裝還需要額外一行:BOOTPROTO=dhcp;固定 IP 的安裝當然需要:BOOTPROTO=static
假設介面是 eth0,你可以(透過 root 的身份)這樣編輯 ONBOOT
# cd /etc/sysconfig/network-scripts/ 
# sed -i -e 's@^ONBOOT="no@ONBOOT="yes@' ifcfg-eth0
關於「更改預期結果」:上述例子採用「傳統」的網絡裝置,eth0。其它裝置名稱亦有可能出現,例如:em1p3p1 等。不論你喜歡與否,這個為介面命名的改動是 Linux 的未來趨勢。它已包含在上游的「測試發行版本」作為預覽。此外請參閱:Dell 的介紹及內部員工的網誌

3. 要是我想還原至舊的命名呢?

以下是所需的步驟:
  • 在 grub 加入 net.ifnames=0 and biosdevname=0 作為內核參數
  • 在 /etc/sysconfig/network-scripts/ 內把你的網絡卡設定檔改名為 ifcfg-ethX
  • 假若你擁有多個介面並希望控制每個裝置的名稱,不想由內核作主,你似乎有必要透過 /etc/udev/rules.d/60-net.rules 蓋過 /usr/lib/udev/rules.d/60-net.rules。

4. 但我只想令它運作及手動式編輯設定檔。

很多安裝用不著 NetworkManager 工具的複雜性,而採用人手編輯的設定檔。以下是一個 非 NetworkManager 的 DHCP 介面設定範例:
[root@example ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO=dhcp
NM_CONTROLLED="no"
PERSISTENT_DHCLIENT=1
ONBOOT="yes"
TYPE=Ethernet
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME="eth0"
[root@none ~]#
以及一個「靜態分配」設定檔的範例:
[username@hostname]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="00:21:70:10:7E:CD"
NM_CONTROLLED="no"
ONBOOT="yes"
BOOTPROTO=static
# BOOTPROTO=dhcp
IPADDR=10.16.1.106
NETMASK=255.255.255.0
#
# GATEWAY 有時會放在:/etc/sysconfig/network
GATEWAY=10.16.1.1
此外,通用項目如主機名稱及 DNS 伺服器可選擇性地放置在:
[username@hostname]$ cat /etc/sysconfig/network
HOSTNAME=acme.example.com
DNS1=10.16.1.112
DNS2=8.8.8.8
## DNS2=76.242.0.28
SEARCH=example.com
這些資訊是「選擇性」的,因為一台 DHCP 伺服器能派發這些數值。當一個良好部署的 DNS 環境存在時,initscripts 能夠從 PTR 等記錄找出主機名稱等資訊,但有些用戶需要以人手管理這些細節。要取得更多資訊,你可用以下方式列出整全的 initscripts 文檔:
rpm -qd initscripts 
不論該環境是否安裝了 man 閱讀說明手冊的套件及所依賴的套件。

5. 我如何停用 IPv6?

上游僱員 Daniel Walsh 建議不要停用 ipv6 模塊,因為這樣會導致 SELinux 及其它元件出現問題。你可改而在 /etc/sysctl.conf 加入:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
要在運作中的系統停用它:
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
附加備註 #1:要是你在停用 IPv6 的系統上轉接 X 時遇到問題,請編輯 /etc/ssh/sshd_config 及作出以下一組改動:
(1) 更改這一行
#AddressFamily any
AddressFamily inet
(inet 指定 ipv4;inet6 指定 ipv6)
或者
(2) 移除這行行首的井號(#)
#ListenAddress 0.0.0.0
然後重新啟動 ssh。
附加備註 #2:要是你在停用 IPv6 的系統上啟動 postfix 時遇到問題,你可選擇
(1) 編輯 /etc/postfix/main.cf 並備註掉 localhost 部份的設定及採用 ipv4 迴路。
#inet_interfaces = localhost
inet_interfaces = 127.0.0.1
(2) 從 /etc/hosts 取掉 ipv6 的 localhost。
附加備註 #3 :如要停用 RPCBIND ipv6(rpcbind、rpc.mountd、prc.statd),請在 /etc/netconfig 備註掉 udp6 及 tcp6 行:
udp        tpi_clts      v     inet     udp     -       -
tcp        tpi_cots_ord  v     inet     tcp     -       -
#udp6       tpi_clts      v     inet6    udp     -       -
#tcp6       tpi_cots_ord  v     inet6    tcp     -       -
rawip      tpi_raw       -     inet      -      -       -
local      tpi_cots_ord  -     loopback  -      -       -
unix       tpi_cots_ord  -     loopback  -      -       -

6. 我可以從哪裡下載 32 位元版本?

我們計劃透過社群的參予建立完整的 32 位元 CentOS-7 發行版本作為第二個架構。我們會隨著事情的發展而發放更多資訊,但暫時未有估計的完成時間。

7. 你對 ifconfig/netstat 做了甚手腳?

ifconfig 及 netstat 工具程式在 CentOS 5 及 6 的應用手冊內被標示為降級已接近十年,而 Redhat 決定在 CentOS 7 不會預設安裝 net-utils 套件。取而代之的工具是 ss 和 ip。假如你真的、真的很需要 ifconfig 和 netstat,你可執行 yum install net-utils。
Translation of revision 17