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

2008/09/01

Ubuntu 上 VirtualBox 的 Host Key

在 Ubuntu 上安裝 VirtualBox 很容易,卻很容易遇到一個問題:Host Key 沒有作用。其實,正確的說法是:在 guest OS 上不能使用 keyboard。

這問題很容易解決,只要安裝 scim-bridge-client-qt 這個 package 就可以了。安裝完之後,記得重開機才會生效。

2008/08/31

VirtualBox 的三種網路型態

VMware Player 的 host OS 和 guest OS 之間有 三種網路型態。VirtualBox 同樣也有三種,而且功能很類似:
  • Host Interface Networking (HIF)
  • Internal Networking
  • Network Address Translation (NAT)
其中,Network Address Translation (NAT) 與 VMware 的名稱一樣,功能也完全相同。

Host Interface Networking (HIF) 除了名字不同之外,功能和 VMware 的 Bridged Networking 是一樣的。

Internal Networking 則和 WMware 的 Host-Only Networking 相近,但有以下不同:
  • Internal network 上沒有 DHCP server
  • 不能直接和 host OS 溝通
當然,如果你比較習慣 VMware 的 Host-Only Networking,已經有人試出設定的方法:

2008/08/30

用 VirtualBox 跑 Ubuntu Server

利用 VirtualBox 來安裝 Ubuntu 8.04.1 LTS Server Edition。過程很順利,不過安裝好了 Ubuntu 卻開不起來,開機時出現 CPU 缺少了一些 feature 的錯誤訊息:
This kernel requires the following features not present on the CPU:
0:6
Unable to boot - please use a kernel appropriate for your CPU.

原來 32bit 的 x86 最多只能支援到 4GB 的 RAM,但若有 PAE (Physical Address Extension) 的加持就能擴充到 64GB。因為 Ubuntu Server 的 32bit kernel 用到 PAE 這個特性,所以在 VirtualBox 上必須啟動這個 PAE:
Settings -> General -> Advanced -> Enable PAE/NX

2008/07/02

Ubuntu 的 Manpages

寫程式時發現有些標準的 C 函數 man 不到,查了一下才發現 manpage 是分散在三個 packages,需要自己安裝:
$ sudo apt-get install manpages
$ sudo apt-get install manpages-posix
$ sudo apt-get install manpages-posix-dev
其中:
  • manpages 包含 GNU/Linux 的基本操作,應該預設就會安裝到。
  • manpages-posix 則包含 POSIX 所定義公用程式的用法。
  • manpages-posix-dev 則包含 POSIX 的 header files 和 library calls 的用法。寫程式的人一定需要這一個。