2008/10/28

不用 sudo!以 non-root 身份用 Wireshark 抓封包

在 Ubuntu 上安裝好 Wireshark,想抓封包時卻找不到網路卡。原來必須執行 "sudo wireshark" 才有足夠的權限。這樣子除了麻煩之外,還有一個不方便:封包存檔之後是屬於 root 所有,處理起來相當不便。

經過一番努力,找出幾個解決方案 (越後面的方法越好)。

方案一

最簡單的作法是安裝完 Wireshark 之後執行 "sudo chmod u+s /usr/bin/dumpcap"。這樣子就可以一般使用者的身份抓封包了。關鍵在於 "dumpcap" 就是那個需要 root 權限的部份,上述指令讓一般使用者也可以 root 的身份執行 "dumpcap"。

這種方法雖然簡單,但對講求安全的人來說卻不太妙。因為所有人都可以執行這隻需要 root 權限的程式。方案二是一個改進的方法。

方案二

改進的方式就是只開放給特定 group 的人以 root 身份執行 "dumpcap":
  1. 執行 "sudo vi /etc/group" 並新增一個 group (建議叫做 "wireshark"),然後將自己加入此 group
  2. 執行 "sudo chgrp wireshark /usr/bin/dumpcap",將 dumpcap 改為 wireshark group
  3. 執行 "sudo chmod 4754 /usr/bin/dumpcap",只讓屬於 wireshark group 的人可以 root 身份執行 dumpcap
完成上述動作之後,重新登入讓 group 所屬生效。這樣你就可以用原本的身份抓封包了,封包存檔的所有也都屬於原本的身份。

方案三

方案二雖然已經限縮有執行權限的人,但終究還是以 root 身份執行 dumpcap。更嚴謹的方法是:利用 Linux Capabilities 只授權 dumpcap 有抓封包的權限。方法如下:
  1. 同方案二的步驟 1 和 2
  2. 執行 "sudo chmod 750 /usr/bin/dumpcap",只讓屬於 wireshark group 的人可以執行 dumpcap (以一般身份)
  3. 執行 "sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap",授予 dumpcap 有抓封包所需的權限 (若沒有 setcap,請自己安裝 "sudo apt-get install libcap2-bin")
參考資料:

2008/10/23

Running Wireshark as a non root user

In general, we have to run "sudo wireshark" to capture packets. It is very annoying. Luckily, I found solutions that work on my Ubuntu box.

Solution 1:

The simplest way is to run "sudo chmod u+s /usr/bin/dumpcap" once. That's all! Because "dumpcap" is the only part that need root privileges. However, it is not a good practice to enable all to run an executable that has root privileges.

Solution 2:

The better solution is to create a group and allow the members of the group to run "dumpcap" with root privileges:
  1. "sudo vi /etc/group" to create a new group, say "wireshark", and enroll yourself to this group
  2. "sudo chgrp wireshark /usr/bin/dumpcap"
  3. "sudo chmod 4754 /usr/bin/dumpcap"
Logout and login again to take the new groupship and you can use Wireshark to capture packets as a non-root user.

Solution 3:

The best solution is to grant "dumpcap" the right to do its job without involving root access at all:
  1. Same as step 1 & 2 of Solution 2
  2. "sudo chmod 750 /usr/bin/dumpcap"
  3. "sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap"
References:

2008/10/17

在 Ubuntu 上安裝 Apache2 的 HTTPS Server

在 Ubuntu 8.04 上安裝一般的 Apache2 HTTP server 非常簡單,只要以下的指令:
sudo apt-get install apache2
若要安裝支援 SSL 的 HTTPS server 還需以下步驟:
sudo apt-get install openssl
sudo apt-get install ssl-cert
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf \
/etc/ssl/private/localhost.pem
第三動是要產生 SSL 用的 key。執行時會問以下的問題 (若只想作作實驗,可以先隨便填):
Country Name = TW
State or Province Name = Taiwan
Locality Name = Some-Locality
Organization Name = One Organization
Organizational Unit Name = Organizational Unit Name
Host Name = localhost
Email Address = webmaster@localhost
接下來是要設定 Apache2:
# 先換到這個目錄
cd /etc/apache2/sites-available/
sudo -s

# 保存一版原有的 default
cp default default.backup.date

# 確定 default port 是 80
sed -i '1,2s/\*/*:80/' default

# 複製 default 來當作 ssl 的樣板
cp default ssl

# 以下兩個 sed 是將樣板前給行修改成 SSL 需要的設定,也就是:
# ========================================
# NameVirtualHost *:443
# <virtualhost>
# ServerAdmin webmaster@localhost
# SSLEngine On
# SSLCertificateFile /etc/ssl/private/localhost.pem
#
# DocumentRoot /var/www/
# ========================================

sed -i '1,2s/\*:80/*:443/' ssl
sed -i "3a\\\tSSLEngine On\n\tSSLCertificateFile /etc/ssl/private/localhost.pem" ssl

# 把剛剛完成的 SSL 掛上去
a2ensite ssl
a2enmod ssl

# 重新啟動 apache2
/etc/init.d/apache2 restart
完成上述動作之後,你就可以用 https://localhost 看到「It works!」了。當然,架正式網站時,你可能會想要一個正式的 key。那麼上面的資料就要好好填,而且得準備一點錢去申請。這我就沒有經驗了。

參考資料:
https://launchpad.net/ubuntu/+source/apache2/+bug/77675/comments/47