2012年2月20日

[Solaris 10]在內建的ftp服務中把使用者限定在自己的家目錄中 (chroot)

Solaris 10的設定總是感覺比RHEL複雜,這次要實作的是 FTP chroot,讓使用者透過 FTP 連線後僅能存取自己的 home directory 中的檔案(Linux 的設定請參考鳥哥的文章),Google 一陣子之後很多文章都建議不要用Solaris內建的 ftp,另外安裝 vsftpd or ProFTPD, 難道內建的 ftp 就做不到 chroot 嗎?當然不是,只是網路上相關得文章異常的少,以下就是設定步驟。

參考:How to restrict user to a specific directory in Solaris 10 (詳細步驟列在 Bazookaaa 於2010-10-20 的回覆中)

其實 Bazookaaa 的說明已經很清楚了,以下補充幾點:

  1. Bazookaaa 的步驟從 create new user 開始,但是對現有的 user 也可以作到 chroot,只要略過 Step1,直接執行 Step2 中的 ftpconfig -d /path/to/user's/home/directory 就可以了。
  2. 在 Step3 中提到要在 /etc/ftpd/ftpaccess 檔案中以「guestuser username」的方式新增要 chroot 的 user,若要對一個以上的 user 實作 chroot,要每個帳號寫一行,範例如下:

    guestuser user1
    guestuser user2
  3. Step4 & Step5 只是要再仔細 check 一下,基本上不需要進行特別的調整。

實作過一次以後就不覺得很難了,只是第一次要實作的時候資料很難找就是了 XD

[Solaris10/RHEL4/5] 設定允許使用ssh登入主機的網域白名單

最近發現了廠商會透過類似 SSH Over HTTP 的方式從外部網路直接穿透 80 port 連到機房的內部網路(透過一台在公網有開放 80 port 的設備),而後再以該台設備為跳板連到其他機器。雖然說只是要進行維護的動作,但違反了資安規定,也因此讓我們驚覺還有這種無法透過 firewall 控管的漏洞。(查了一些資料以後發現,據說連 L7 Switch 都擋不住)

為了防堵這樣的連線方式,想到可以透過設定白名單的方式,正面表列允許使用 ssh 跟主機通訊的網域白名單,以下分別說明在 Solaris 10 & RHEL/CentOS 4/5 要如何設定。

Solaris10
參考:
  1. Solaris 10 - IPFilter 防火牆
  2. IP Filter FAQ
其實 IPFilter 的功能很強,透過規則的組合可以達到非常細膩的控制,在參考資料中就可以看到一些範例。要限制可透過 ssh 連線的網域白名單就簡單多了,步驟如下:

Step 1: 確認 pfil & ipfilter service 均已啟用

  • 執行 svcs pfil ipfilter,兩個服務的 STATE 應顯示為「online」。
  • 預設 pfil 服務是啟用的,而 ipfilter 則是 disabled,只要執行 svcadm enable ipfilter 就可以啟用 ipfilter 服務。

Step 2: 修改 ipfilter 設定檔 /etc/ipf/ipf.conf

  • 依序加入以下設定 (順序非常重要,block 的設定要放在最後面):
    pass in quick log proto tcp from 10.10.10.0/24 to any port = 22
    pass in quick log proto tcp from 10.10.11.0/24 to any port = 22
    block in log proto tcp from any to any port = 22
  • 上述設定可允許來自 10.10.10.0 ~ 10.10.10.255 & 10.10.11.0 ~ 10.10.11.255 的 ssh 連線 (inbound),其他 source ip 一律會被阻擋。這是比較簡單的設定法,只要把來自非法網域的 inbound traffic 擋住了,就不用考慮 outbound traffic 了。
Step 3: 執行 ipf -Fa -f /etc/ipf/ipf.conf,以 flush all 並重讀 firewall 規則表。可再執行 ipfstat -io 來確認目前inbound & outbound的規則為何。

Step 4: 在背景執行ipmon,紀錄被阻擋的連線
  • ipmon /path/to/ipf/log &
  • 被阻擋的紀錄範例如下:
    20/02/2012 14:14:07.082422 e1000g0 @0:4 b 10.1.xx.xx,40258 -> 10.1.xx.xx,22 PR tcp len 20 60 -S IN
RHEL/CentOS 4/5
參考:
  1. TCP Wrapper for added Security on SSH
  2. /etc/hosts.{allow|deny} 的設定方式
由於 /etc/hosts.{allow|deny} 設定比較簡單,且 RHEL/CentOS 4/5內建的sshd就有支援 TCP Wrapper,所以就用這種方式囉。

Step 1: 確認目前使用的 sshd 是否支援 TCP Wrapper
  • 執行 ldd /usr/sbin/sshd | grep libwrap,應出現以下 output:
    libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00b22000)
Step 2: 編輯 /etc/hosts.allow (不可使用 10.10.0.0/16 表示法):
  • sshd:10.10.10.0/255.255.255.0
    sshd:10.10.11.0/255.255.255.0
Step 3: 編輯 /etc/hosts.deny (不可使用 10.10.0.0/16 表示法):
  • sshd:ALL

Step 4: 設定完畢後不需重起 sshd,會立刻生效。

Step 5: 查看被阻擋的紀錄

  • log 檔位置在 /var/log/secure,可執行 grep refused /var/log/secure 來查看
  • 範例如下:
    Feb 17 17:26:53 [hostname] sshd[3034]: refused connect from ::ffff:xxx.xx.xxx.xx (::ffff:xxx.xx.xxx.xx)

2012-03-03 Update:
有網友留言詢問此設定能否阻擋reverse ssh tunnel over http,找了一下資料,利用這篇文章中的作法實作之後,發現在連線時 source IP 會是 127.0.0.1,因此只要在 /etc/hosts.allow 裡面不要允許來自 127.0.0.1 的連線,reverse ssh tunnel 就不會通了。

雖然這篇的作法看來是沒有「over http」,但應該只要觀察 ssh 連線的 source IP,就可以利用 /etc/hosts.{allow|deny} 來阻擋了。


2011年12月31日

iPhone 4S 預購心得

每年的 iPhone 預購,已經成為我工作上最重要的大事(就這兩年的經驗來說,也是必定出包的大事Orz),過程中累積了一些經驗,上週更是有機會請設計/維運另一個知名訂票系統的同事來分享心得,整理如下。

  1. 系統架構愈簡單,request 經過的節點愈少,就更好調整相關參數,當發生異常時也比較容易掌握是哪裡出了問題,系統效能也會更好。
  2. 當預購開始時,瞬間湧入的超大流量不管準備多少實體設備都不夠應付(畢竟預算&機房空間有限),因此在request經過的各節點設定限流是必要的手段,包括 Firewall, Switch, AP/DB Server 之間的流量限制。但是最佳的參數為何,需要在相同的系統環境(軟硬體規格)下持續進行調整才能得到。
  3. 承上,叢集系統若為異質平台組成,或者硬體規格有明顯差異者,管理起來會很麻煩,最好能針對每一台設備去調整限流的參數,才能得到最大的 throughput。若要降低管理/調校的成本,最好能用相同的硬體規格/平台,否則就要有很強大的軟體架構(網路層/AP層),能夠自動根據每一台機器去設定相關參數,才能讓每一台設備都發揮最大的效能。
  4. IDP/IPS/Firewall等資安設備的參數調校是很大的學問,在平日沒有承載足夠流量下所做的設定,面對瞬間/持續超高流量時不一定能運作的很好,甚至可能會造成反效果,因為誤判而將正常流量給block掉,處理起來非常頭痛(可能要臨時把相關policy disable,甚至改接網路線將流量bypass這些資安設備)。
  5. 減少系統內紀錄的log對於效能會有所幫助(還可以避免因磁碟存取異常造成整個系統效能下降的問題),但要考量萬一產生客訴,需要調閱資料的時候能否取得足夠的資料,原則上log還是要能免則免,非得要紀錄的話寫到另一個獨立的 DB 效能會比寫到 file system 好。
大概就這樣啦,2012會是忙碌的一年,年中有倫敦奧運,第三季可能就會有 iPhone5 預購啦,希望可以順利度過!

2011年回顧

又到了一年一度的這個時候了

今年坎尼比較專心在研究所課業上,所以發文量很明顯下降了,看到去年寫的回顧文內容說,要給更多優質內容就不禁汗顏 (汗)

坎尼這一整年有三分之一的日子去參加了某創業比賽,但嚴格說起來應該就只是創業過程體驗比賽,雖然花了不少時間,但仍收獲良好,未來有機會再跟各位分享

接著要分享的是本學期所修的一門課,這門課的內容在談資訊系統怎麼幫助企業達成目標,其實上課的時候坎尼有些感觸:

  • 很多公司在推資訊系統時,只是跟進其他同業,並未想過組織目標為何,所以系統買了或是開發了就放在那邊沒用…
  • 工程師並未全盤了解組織策略為何,這樣開發出來的系統肯定無法符合需求,到頭來就只是在使用者端不斷地來回,修改需求。
    (是說為什麼不用 prototype 開發方法?)
  • 不符合工作目標的系統,上線日就等於系統的死亡日
  • 現在出去的大學生/研究生連Code都不會Code了…更別提了解策略並規劃資訊系統。

總覺得老師也是鄉民來著,很酸 XD

今天是今年的最後一天了,也總算在本月看到 Nokia 和 Microsoft 合作的 Lumia 系列手機在台灣上市,希望這是智慧型手機 OS 即將三分天下的預兆!

[SQL SERVER] SQL SERVER 無法使用帳號登入之原因

坎尼和同學們最近要為論文寫資訊系統
剛好以 SQL Server 2008 R2 當資料庫系統
沒想到同學們沒用過,所以發生了不少設定上問題
所以把初心者在使用 SSMSE 時,無法登入的可能原因整理成一篇


I. 伺服器安全性設定

S 同學照著網路上的範例建立好資料庫
沒想到寫好一個程式之後,怎樣都無法用帳號登入
但用 Windows 整合驗證是正常的

坎尼檢查了一下才發現,S同學忘了修改伺服器驗證屬性
SL01 如上圖把伺服器驗證改為SQL Server及Windows驗證模式即可

II. 帳號安全性

C同學已修改過上述屬性,但仍是有帳號無法登入之問題
檢查之後才發現同學在帳號屬性中,選了強制執行密碼逾期
所以寫程式去連接時,會有帳號密碼已逾期之例外發生
無奈現在年輕人都不怎麼靜下心來看錯誤訊息寫什麼

坎尼修改該帳號登入屬性之後程式就可以跑了,可喜可賀
SL02

III. 小結

最近在幫同學們處理這些問題,發現並不是工具不好用
反而是使用者常常會忽略工具所提供的訊息
  • 看到警告視窗→確定
  • 不管內容寫什麼,點 同意 就對了
不知道是不是現在人接觸太多資訊科技
已經被一些好用的應用程式慣壞了?

但反過來想,程式設計師在設計這些訊息的時候
是不是也該想想使用者會有什麼樣的反應發生呢?

2011年11月16日

如何將各種不同短網址服務(URL Shortening Services)產生的短網址還原

最近遇到一個需求,要用程式將大量的短網址還原為原始的完整網址,以便進一步對這些網址作分析,在 .NET 中可以很容易的完成這個功能。

首先要先擬出個大概的流程,也就是利用程式送出 HTTP GET request,然後針對收到的 HTTP response 去解析完整的網址為何。

有了大概的概念之後,大概 Google 一下就會找到這篇 MSDN 參考資料:How to: Send Data Using the WebRequest Class. 從裡面可以知道,WebRequest 和 WebResponse 會是最重要的兩個 class。

重點程式如下:

一:以短網址作為參數,建立一個新的 WebRequest 物件,並設定要使用 HTTP GET:
WebRequest request = WebRequest.Create("http://goo.gl/UjDtF");
request.Method = "GET";

二:若你的環境需要透過 proxy 才可以連外,則加入以下這行:
request.Proxy = WebProxy.GetDefaultProxy();

三:發出 request,並解析收到的 response,原始的網址就是 response 的 ResponseUri.AbsoluteUri:
WebResponse response = request.GetResponse();
string originalURL = response.ResponseUri.AbsoluteUri;

就這麼簡單,完整的範例程式碼請參考RestoreShortURL.zip

2011年8月2日

MIS 必備技能:製作光碟映像檔(.iso files)

前陣子被問到如何在沒有光碟機的 NB 上播放 DVD 光碟(或者是如何安裝軟體),這才發現連唸資訊相關科系的學生也有很多人不懂如何製作光碟映像檔。

除了在沒有光碟機時必須要使用到映像檔以外,使用映像檔也可以避免光碟片因經常使用而損壞,所以現在我拿到如 WebCam 的 driver 之類的光碟片,就會把光碟片做成映像檔,之後都用映像檔安裝/移除軟體,光碟就封存備用了(或者直接拿去回收)。

未來光碟機的使用可能會越來越少,因為影音檔案/軟體安裝檔都可以從網路上取得,online video streaming 也已經到達 HD 高畫質的地步,光碟機這種速度慢又很吵的設備就越來越無用武之地了(大概只會剩下高階的藍光光碟機)。

從 Apple 的產品策略可看出 Apple 認為未來光碟機將會消失,例如:
至於未來市場發展是否會如 Apple 的定位,大家就拭目以待囉。

其實只要直接 Google「製作映像檔」就可以找到一堆軟體介紹以及圖文並茂的使用說明,例如:
我就不狗尾續貂啦。

我自己是習慣用 ImgBurn + VirtualCloneDrive (因為當初 Win7 在 beta 的時候包括酒精之類的一大堆軟體都無法掛載映像檔,用久就習慣這個組合了),用了很久都沒啥問題,如果有需要的人可以試試看。

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D