Ubuntu Linux 上的 EZ100PU 晶片讀卡機驅動程式 + WebATM 安裝筆記

身為一個不算短期的 Linux 使用者 (我的個人含工作用電腦 “幾乎” 都是 Linux 系統的),能在 Linux 上使用 WebATM (網路ATM) 這樣方便的功能是不可少的,早期 WebATM 都是 ActiveX 外掛,也就是只能支援微軟的 IE (Internet Explorer) 瀏覽器 ,近年來台灣已經有數家銀行開始支援非 IE 的瀏覽器擴充套件來使用 WebATM 了,目前已知有以下幾家銀行支援 IE 以外的瀏覽器並且支援 Linux 作業系統,其中玉山銀行要特別講一下,雖然我個人沒有任何玉山銀行的帳戶,沒有特別要幫他打廣告,但玉山銀行是台灣 WebATM 走出瀏覽器 IE only 的先鋒,值得大家鼓勵啊 ~

本篇紀錄我在 Linux Mint 17 (based on Ubuntu 14.04 LTS) 上安裝晶片讀卡機驅動程式以及 WebATM 工具的流程,以便下次安裝可以更快回憶起來該如何操作。其實晶片讀卡機除了用於網路 ATM 以外,讀取電話的 SIM 卡、健保卡、自然人憑證、或一些電子錢包(像iCash)、會員卡(查詢裡面的點數)等都很方便,以前我個人還滿常拿來備份電話 SIM 卡上的聯絡人資料,在當時是挺實用而且滿有趣的(現在應該都靠雲端同步了)

這邊拿玉山銀行作為範例,實際上各家銀行操作流程應大同小異,主要就是系統服務所需相關套件、安裝晶片讀卡機驅動程式以及銀行的程式。

首先需要安裝 pcscd & pcsc-tools 套件:

$ sudo apt-get install pcscd pcsc-tools

此操作應該會連帶安裝兩個相依套件:libccid、libpcsc-perl (也有可能更多、端看系統上已經安裝過的套件而定)

安裝好需要套的套件後接著安裝驅動程式,這邊就自行按照廠牌以及型號到讀卡機網站下載驅動按照說明即可,例如我這邊是使用很常見的 EZ100PU (網路上買很便宜,好像很多銀行也會拿來當贈品),可以在這邊下載到驅動程式:

閱讀全文

Git repository 中,檔案名稱大小寫的重新命名

Git-Logo-1788C

先前以為 Git 對於檔名的處理是不區分大小寫的(case-insensitive),後來發現其實 Git 是會區分檔名大小寫的,只是作業系統和檔案系統就不一定是這樣了

例如 FAT 檔案系統本身是不區分大小寫的,Mac OS 使用的 HFS+ (或叫做 Mac OS Extended) 雖然支援區分檔名大小寫,但 Mac OS 預設沒有啟用區分大小寫,要重新格式化磁碟為有區分大小寫的檔案系統才行,至於 NTFS 雖然有支援區分大小寫,但 Windows 預設的行為也是不區分大小寫的,所以結論幾乎可以說是在 Mac OS 和 Windows 系統上,檔案系統預設都是不區分大小寫的果然還是用 Linux 或 FreeBSD 比較簡單

如果只是把檔名從 program.cs 改為 Program.cs,用 git status 指令看狀態時會看不到任何改變:

~/test $ git status
On branch master
nothing to commit, working tree clean

~/test $ mv program.cs Program.cs

~/test $ git status
On branch master
nothing to commit, working tree clean

如果自己動手 git mv 呢?有可能會遇到 destination exists 這個問題:

~/test $ git mv program.cs Program.cs
fatal: destination exists, source=program.cs, destination=Program.cs

在網路上有看到一種作法,先將檔案改為另外一個沒有完全相同字母的檔名,再改為目標檔名,藉此替換大小寫:

~/test $ git mv program.cs program.temp && git mv program.temp Program.cs

不過這也太累了,後來發現加上 --force (-f) 的參數就可以搞定這問題了:

~/test $ git mv -f program.cs Program.cs

這時候再用 git status 看狀態就會發現 git 已經可以成功識別重新命名了:

~/test $ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	renamed:    program.cs -> Program.cs

關於 git mv--force 參數說明是這樣的:

Force renaming or moving of a file even if the target exists

看來只能暫時這樣處理了,用到的機會目前看起來也不是很多就是了~

註:在新版(明確是哪個版本就沒去追了)的 git 直接用 git mv 操作的看起來已經沒問題了,不需要加 -f 也不需要兩段式操作了,讚!

用 Apache, nginx, PHP 架網站要注意的安全事項

在 Linux 底下,拿 Apache 或 nginx + PHP 是架網站非常常見的組合 (LAMP/LNMP),這篇要筆記一下怎麼藏伺服器相關的版本資訊

對於開發平台來說這些 http header 資訊可以幫忙除錯,但對於開放使用者存取的服務,若非使用上的需求,建議是把相關的 http header 藏起來,減少資訊洩漏

ubuntu_apache_php_header_in_chrome
圖例,用 Chrome 瀏覽器看出 Server版本為 Ubuntu 14.04 + Apache 2.4.7 + PHP 5.5.9

本篇拿 Ubuntu/Debian based GNU/Linux 示範,開始動手之前,大家可以先用 curl 這個工具把網站的 header 撈出來,改完之後就可以比較看看結果!

命令如下,127.0.0.1 請換成自己的網址~

$ curl -LI 127.0.0.1

結果大概會長這樣:

HTTP/1.1 200 OK
Date: Wed, 30 Dec 2015 08:36:26 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8

有看出端倪了嗎?

接下來講動手做,先說 http 伺服器的部分:

– nginx:
在 nginx.conf 的 http 區段(用大括號括起來的部分)裡面找到 server_tokens 這個設定並設為 off,記得拿掉前面的註解,如果找不到這行也可以自己新增:

server_tokens off;

重啟 nginx 後大功告成:

$ sudo service nginx restart

– apache:
以 Apache 2.4.x為例子,相關設定預設會在 Apache 設定檔路徑 (/etc/apache2) 的 conf-enabled/security.conf 裡面,看設定檔名稱就可以顧名思義知道和安全性有些關係

如果找不到 conf-enabled/security.conf 但找的到 conf-available/security.conf,表示設定檔沒被啟用,可以透過這個命令啟用:

$ sudo ln -s /etc/apache2/conf-available/security.conf /etc/apache2/conf-enabled/security.conf

這邊我們要改兩個設定,分別是 ServerTokens 和 ServerSignature

ServerTokens 會在每一次伺服器回應請求的時候送出,設定值分別有 Full | OS | Minimal | Minor | Major | Prod 這六個選項
從左至右分別為洩漏最多的資訊量到最少的資訊量,預設通常是 OS、建議改成 Prod,這樣就只不會顯示伺服器名稱以外的任何資訊

ServerSignature 不是在 http header 裡面的資訊,但會出現在一些 Apache 自動產生的頁面,顯示出伺服器版本以及 virtual host 等資訊
預設值為 On,這邊為 Off,當 Server 產生一些錯誤或是檔案列表頁面時,就不會洩漏太多的伺服器版本資訊

重啟 Apache 後大功告成:

$ sudo service apache2 restart

改完之後再用curl測試一次結果會發現 Server header 後面版本、系統等資訊都藏好了:

HTTP/1.1 200 OK
Date: Wed, 30 Dec 2015 08:37:20 GMT
Server: Apache
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8

但上面的 PHP 還在,而且還看得出來是 Ubuntu 系統,如果你有啟用一些額外的module 可能都會順便被印出來,所以接下來講 PHP:

PHP 這邊要改的這個設定叫做 expose_php,這個設定會放在 php.ini 裡面、預設是 On、這邊要調成 Off
expose_php = Off

如果該選項為 On,則 http header 裡面會含有一個 X-Powered-By 的資訊,除了讓大家知道你用的是 PHP 以外,還有使用到的相關模組,還有可能會因此透漏PHP以及作業系統的版本,因各個unix系統幾乎都有自己維護的套件版本,在編譯時可能會因此把作業系統及其版本資訊包進去(如 5.4.4-14+deb7u9 就透漏了他可能正在使用 Debian Wheezy (7.x)),這個資訊不關的話,Apache2的 ServerTokens 很有可能就白設了XD

改完後這邊要重啟的服務因人而異,如果是 PHP 搭配 nginx 可能是要重啟 php-fpm 或 php-cgi,如果是把 PHP 編成 Apache 的 module 的話就是重啟 Apache

重啟後大功告成(自己看要重新啟動哪個服務~因人而異):

$ sudo service apache2/php-fpm/php-cgi restart

HTTP/1.1 200 OK
Date: Wed, 30 Dec 2015 08:39:05 GMT
Server: Apache
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8

恩,有沒有看到 X-Powered-By 不見了?

補充一點,php.ini 可能因為不同的 PHP 使用方式 (apache module / cgi / cli 等) 會有 “很多份”,以 php5 為例,如果你是用 Apache 的 php module,則設定檔會在 /etc/php5/apache2/,若是使用 command line的 PHP,設定檔會在 /etc/php5/cli/,真的不確定的話 … 保險起見,可以將 /etc/php5/ 底下一層各個目錄都翻一下,每份 php.ini 都改一改 (mods-available 是放模組的就不用了)

最後補充,以上方法僅用於 “藏” 資訊,對於找工具針對特定版本伺服器的攻擊也許有點幫助,但並不能真的提升伺服器以及網頁程式本身的安全性,不能就此掉以輕心! 程式面該過濾、跳脫、阻擋的還是要做,永遠不能相信client傳過來的訊息啊~!

另外有一些像是 libapache2-mod-security2 這類的工具可以幫忙防禦一些常見攻擊或是弱點,不過設定不好的情況下也是有很大機率遇到其他狀況,要不要用就見仁見智了,我是遇過用了 mod security 之後預設設定會造成 Discuz 的上傳故障的問題 …