SSH 用戶登入時發信件通知管理者

一個控制慾很強稱職的管理者可能會想要 SSH 用戶登入時能有郵件通知,網路上有些 Linux 的文件可以參考,這邊紀錄一下 FreeBSD 的作法。

比較簡單的方式,是利用 PAM 模組來發送這個訊息。PAM 有一個 pam_exec.so 可以用來執行指令,所以運作原理就是當用戶登入時,去執行發送郵件的 script。

首先你要有個 script 用來發郵件,PAM 會將各種資訊以環境變數的方式傳入 scirpt 中,所以我們可以利用這些變數來做判斷,達成不同的目的。

就我所知不同平台可能有不同的變數名稱,若是想知道有哪些變數可用,可以在 script 內,將 env 輸出的內容寄給自己。
完成後大概長這樣:

將上面的 script 存放在 /root/notify.sh,並使用 chmod 加上可執行的權限。
再來修改 /etc/pam.d/sshd,加上這一行:

其中的 optional 表示不管 script 執行是否成功,都不影響用戶的登入。若是將 optional 改為 required,則 script 若執行失敗也會阻擋用戶登入。

接著就可以嘗試登入看看,並檢查是否有收到郵件了。

MD5 的碰撞

Wiki 的 MD5 頁面 提供了一些碰撞的例子,拿來玩玩。

首先,給的範例是 Hex 字串,得先轉回 Binary:

仔細看,有幾個字元是不同的。用 md5sum 檢查一下輸出:

接著隨便弄個資料:

然後看看把資料擺前面跟擺後面的差別:

把 data.bin 放在後面會產生相同的數值,但放在前面就不一樣了。
順便試試看把這兩個碰撞的內容加在一起會如何:

hmm…竟然不相等 xD

GDBM 讀取資料失敗

GDBM 就是 GNU dbm,是一個輕量的 key/value 資料庫。
今天在使用時,發生了開啟檔案失敗的情況,錯誤訊息:File seek error
原因是 GDBM 它在 32bit 與 64bit 的環境下,產生的檔案格式不相容。
也沒什麼好的解決辦法,只能將資料都倒出來再用對應的版本建立資料庫。
若要在 64bit 的環境下編譯成 32bit 來執行,可使用 gcc -m32 來指定編譯 32bit 版本。

svn log 顯示 no author

今天在查 svn log 時,發現作者那一個欄位都顯示 no author,在官方 FAQ 裡面可以查到原因:http://subversion.apache.org/faq.html#no-author

就是當 svn 沒有做存取限制時,整個檔案庫是公開的,就會造成這個結果。
其實我是有做限制的,只是從 Apache 2.2 升級到 2.4 以後,權限設定的語法改變了。如果前面已經有 Require all granted,後面的 Require valid-user 就會失效。只要把這部份處理好就行了。

使用 Perl 搜尋字串, 執行運算並取代

有時候想要對文字檔的內容做運算後再取代原本的文字,本來是想弄個小程式來處理的,寫著寫著發現根本沒必要。

一開始是這樣子寫的:

這樣子就能用類似 sed 一樣的方式處理文字,例如把秒數換算成分鐘:
script.pl ‘s#second=(\d+)#”minutes=”.int($1/60)#e’ file.txt

弄完以後看著這小程式感覺很眼熟,好像在書上看過?Perl 不是有參數可以做類似的事情嗎?

最後用命令列達成一樣的目的:
perl -p -e ‘s#second=(\d+)#”minutes=”.int($1/60)#e’ file.txt

這次印象深刻了,希望下次要用到時能想起來 xD

Android Debug 時追蹤 SDK Source Code

不管是除錯還是學習,能夠看到完整的原始碼總是比較方便。Android 本身是開放原始碼,所以可以自行下載後再 attach source code。
自 4.0 以後,Android SDK Manager 也提供了 Sources for Android SDK 的選項,可以直接勾選安裝。

ADT 安裝好後,如果你嘗試追蹤一個 Android Framework 的類別,會看到類似如下的畫面:
source not found

這時,先確認有安裝 SDK 原始碼:
install Sources for Android SDK

然後,到專案裡面的 Android SDK 按右鍵,選擇 Properties:
android sdk properties

在 External location 選擇 SDK 路徑底下的 sources/android-[你要的版本]
set sdk source folder

這時隨便挑一個類別,按右鍵選擇 Open Declaration
Open Declaration

接著應該就會顯示出這個類別的原始碼了:
display the source code

在 Debug 時,若是 Trace 進入了 SDK 原始碼,卻發生了跑錯行號的現象,那麼有兩點需要確認:

  1. 你選擇的原始碼版本有對應到目前 Debug 執行的 Android 版本,例如 Debug 的環境是 Android 4.3.1,那就要使用 android-18 的原始碼。
  2. 用來 Debug 的機器最好是官方提供的模擬器,若在實體裝置上執行,那裝置上安裝的版本不一定是官方版本。我自己在 Nexus 7 上面測試倒是都能對的上就是了…

Android Studio 越來越接近正式發行,這個時候寫 ADT 的筆記好像沒什麼價值了 (?

OpenVZ 安裝紀錄

隨著各家虛擬化的競爭越來越激烈,好像後來都沒聽到 OpenVZ 的消息了,但其實 OpenVZ 還是持續有在發展與更新的。
要安裝 OpenVZ,建議使用 CentOS 6 或是 Debian 7,安裝會比較順利。這邊使用的是 CentOS 6。

官方的安裝說明:https://openvz.org/Quick_installation
首先是設定 repository 並安裝 vzkernel 與工具:

接著需要修改 /etc/sysctl.conf,增加以下設定,有些設定原本就在裡面,需要註解掉:

最後修改 /etc/sysconfig/selinux 關閉 selinux,重開機後應該會使用 OpenVZ 的核心開機,這樣就完成安裝了。

主機的環境準備好後,我們接著可以去下載官方準備好的各個 Linux 發行版 template:http://openvz.org/Download/template/cache
下載後放到 /vz/template/cache 並注意 **不需要解壓縮**。這邊我是下載 debian-7.0-x86_64.tar.gz 這一個做練習。
另外,如果要讓 VPS 的網路正常運作,還得修改 iptables 設定,或是關閉 iptables。

有了虛擬機的 template,就可以開始創建 VPS,官方說明在:https://openvz.org/Basic_operations_in_OpenVZ_environment
首先要決定 VPS 的 id,id 就是一個數字,官方保留了 0 到 100 不能使用,100 以上的數字都可以自行選用。

我這邊使用的 id 是 1000,並一併設定了 VPS 的 IP 與 DNS。
–save 表示會將此設定寫在 /etc/vz/conf/1000.conf(1000是 VPS id),若是沒有 save,重開機設定就會消失。最後一行是啟動 VPS 的命令。啟動之後可以用 vzctl enter 1000 進入到 VPS 的環境中,輸入 exit 返回主機環境。

每台 VPS 在建立之後,設定檔會存放在 /etc/vz/conf/ 裡邊,而檔案系統則是放在 /vz/private/ 裡。如果將來需要搬移或是整合,只需要將這兩邊的檔案複製過去即可。假如目的地已經有同樣 id 的 VPS 在運作,也可以很輕易的更換一個新的 id 就可運行。更換的方式就只要把 /etc/vz/conf/1000.conf 及 /vz/private/1000 這兩邊的 1000 改成你要用的數字即可,不需要再做額外的設定。

建立 VPS 之後,防火牆是不可或缺的東西,但是網路上許多相關的文章都有點舊了。例如,若是要使用 state 來設定 iptables 規則,可能會遇到這樣的錯誤:

網路上很多都提到需要修改 vz.conf 之類的,其實都不需要嘍。這個時候,正確的處理方法應該是:

系統資源的分配也是很重要的一環,至少硬碟空間與記憶體都需要做限制:

另外,預設的檔案系統 Layout 是 ploop,若是想要使用 simfs 的話,就只能在創建 VPS 時指定,建好以後就不能修改嘍:

常用命令整理:

Apache log 與 Squid log 的流量差異

同時有 Apache 與 Squid 提供 proxy 服務
在看報表的時候,發現這兩個 proxy 的流量差異有點大
查到最後發現是 Apache 在處理 https 時,不會紀錄到真正的資料流量

60 KB 與 0 的差別…數量一多就會發現差距變很大。

另外,用 tcpdump 驗證了一下這些 log 的資料大小到底包含了哪些部份,結論是與 TCP 的資料長度一致,也就是包含了 HTTP Header,但不含 TCP/IP Header。

使用 Apache 做為 forward proxy

為了做點測試而需要架設 apache proxy server
按理說是挺簡單的東西,結果在 https 的地方卡了一下

以下安裝環境是 Debian 7:

就是少了那個 proxy_connect 害我 https 一直出現 500 錯誤。

如果少了 proxy_connect 的話就會出現這樣的錯誤訊息:

其它的像是 mod_ssl 之類的都不需要。

設定上層 proxy,導給 Squid:

注意這只是個人臨時測試用,架在區網內。若要用在正式的環境,需要對存取 proxy 的用戶做些控管,例如僅允許某些 IP 之類的。

Win8 Metro IE 不允許連往 localhost 127.0.0.1

挺奇怪的問題,在本機執行網頁伺服器做為開發環境,在桌面開啟 IE 可以正常瀏覽,但是若到 Metro UI 開啟 IE 就沒辦法看了。而且我桌面版的 IE 已經關閉了 EPM (Enhanced Protected Mode)。

然後,我在 MSDN Blog 看到了這一句:Metro style Internet Explorer always runs with Enhanced Protected Mode enabled

嗯這就是問題的來源了。

經過了一番 Google 以後,找到了解決辦法,必須要使用 CheckNetIsolation 這個指令來允許 Metro IE 存取 localhost:

第二行是用來恢復原狀用的。

參考資料:
http://msdn.microsoft.com/en-us/library/ie/hh771832(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ie/hh780593.aspx
http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx