2013年3月20日 星期三

如何在 Secure Boot Enabled 環境下啟動 Clonezilla Live


近來應該會遇到愈來愈多的機器 ,內建 Secure Boot 並預設為啟動。如此一來,在這些設備上要啟動其他的作業系統(如:Linux , BSD,.. 等非 Microsoft Windows 8 OS),除非將 Secure Boot 選項關閉,否則將需要用一些修正的方式讓系統能夠開機。

使用再生龍單機版(Clonezilla Live)進行備份前,需要將其原作業系統關機,再使用再生龍 Live CD/USB 開機。這樣啟動非 Windows 8 作業系統的行為,在上述的 Secure Boot Enabled 的設備中,就會立刻被 uEFI 中斷並無法開機。

以 Clonezilla Live USB 開機為例,在 EFI 的規範下,首先載入的就是 usb://EFI/boot/bootx64.efi ( 64位元設備下) 這個啟動元件,但由於 secure boot 的規範,當然無法讓未簽過簽章的這個 EFI 載入器運行,所以,較為可行的方法之一就是使用一個已被簽章過 EFI 載入器(先稱之為 per-loader)來取代原有的 bootx64.efi,之後讓它帶回真正原先的 bootx64.efi (當然,就需要改名為其他的 .efi),如此才能接回原來的開機程序。

目前,Linux Foundation 有釋出一個給 Microsoft 簽章過的 EFI loader ,可參考:
http://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/
所以,可以用這個 pre-loader 來讓其他的 loader 在 secure boot enabled 下開機。

由於用 usb 的彈性比較高,所以下面步驟就以 clonezilla live usb 為例子:

1. 先做一個 Clonezilla live 可開機 usb flash;如何製作請參考  http://clonezilla.nchc.org.tw/clonezilla-live/liveusb.php

2. 下載 Linux  Foundation 釋出的簽過章的 EFI 元件:
將此兩檔案放至 usb://EFI/boot 下

3. 由於所下載的 Preloader.efi  預設下一個會載入 loader.efi ,所以為了能接回原來有開機流程,必須做一些檔案的 檔名更改。
切換至 usb://EFI/boot/ 目錄:
  • bootx64.efi -> loader.efi
  • PreLoader.efi -> bootx64.efi
  • HashTool.efi 維持原檔名
完成。如此修改後的 usb flash 即可在secure boot enabled 的設備進行開機。

目前,在 secure boot enabled 設備第一次啟動時,需要將下一個 loader (loader.efi) 註冊至 MOK 中,這行為仍然需要一次的人為的介入。加入一次後,以後則不需要重覆此步驟,除非進 BIOS 清除相關簽章檔案。

以筆者的 PC 為例(ASUS BM6675/中信標案 MD750;BIOS :  v0625;Secure Boot Enabled),第一次開機步驟如下:

1. 選擇以 UEFI : usb flash 開機 (若設備仍允許 legacy mode 的話,則會看到有另一個非 uEFI 的相同設備)

2.  由於 loader.efi (原 Clonezilla live 的 bootx64.efi) 尚未簽章,當然不允許被執行,所以下一階段會執行 hashtool 處理


3. Hash Tool 主畫面,選擇 「Enroll Hash」來位 loader.efi 註冊


4. 選擇 loader.efi 進行註冊


5. 確認註冊進 MOK


6. 完成並離開 Hash Tool


7. 控制權交由 loader.efi 接手,啟動 Clonezilla Live 開機選單


一台設備上這樣的註冊動作只需要一次,下次用同一個 usb flash 開啟時,則會自動進入 7. 的選單。

有幾種情況可能需要重新註冊:
1. MOK 註冊資料被清除(ex:恢復預設值)
2. loader.efi 更改過(ex: 重新植入不同版本的 Cloneizlla Live)

事實上,Linux Foundation 有釋出 keytool.efi 的工具,能夠進階的管理設備中的 key DB (PK,KEK, DBX, MOK,.. 等),下回補充。


Reference:

2013年1月21日 星期一

常用的 ssh 轉 port 方式

 記錄常用的幾種 SSH 通道與轉 port 的使用
  • Tunneling VNC Connections Over SSH 
一般 vnc 協定並無資料加密,建議使用有加密方式,或將通道以加密方式包裹。
下面例子則是以 ssh tunnel 方式,讓 vnc server 的兩端,以加密的通道 (SSH) 進行溝通。此方式的條件是 vnc server 機器上也需要有 ssh daemon 。
場景:VNC server(vncserv.host) 上的 vnc posrt 為 5901 (若一般 vnc viewer 則為vncserv.host:1)
    • 在 local (控制端)執行指令並以建立 SSH 通道
$ ssh -L 5901:localhost:5901 -N -f -l user vncserv.host
    • 在 local 端起動一般 vnc viewer 程式,但連線位置是指為 localhost:1
$ vncviewer localhost:1
  • Tunneling Transmission remote deamon Connections Over SSH
 Transmission remote通常以 web: 在localhost:9091進行管理, 但預設並無以 SSL 登入帳號認証方式,故透過 SSH tunnel 是個較安全的方式
    • 在 local (控制端)執行指令並以建立 SSH 通道
$ ssh -L 9191:localhost:9091 -N -f -l user my.transmission.host

建立後則可用下列方式進行 web 連線

http://localhost:9191/
  • Reverse SSH tunnel SSH connection to a NAT'ed box
反向的 SSH 連線上。例如,要 ssh 到 NAT 內的機器,除非在 NAT 上設定,不然無法 ssh 連通至內部 ssh service。透過 reverse SSH tunnel connection 則可。
    •  先在 NAT 內的機器對外(public.host) 建立連線
$ ssh -R [port00]:localhost:[port01] -N -f -p [port] user@public.host


port00 : 在 public.host 上想開啟的 port
port01 : 在 NAT 這台機器中 (localhost) 自己 ssh daemon 的 port
    • 在外部的機器(public.host)則透過自己的 port00 進行與 NAT 中的機器連線
$ ssh -p [port00] user-id@localhost


Note:
  • -L 5901:localhost:5901 : Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. Here you are using port 5901 on the localhost to be forward to sshserver.mydomain.com on the 5901 port.
  • -N : Do not execute a remote command i.e. just forward ports.
  • -f : Requests ssh to go to background just before command execution. Requests ssh to go to background just before command execution. Once password supplied it will go to background and you can use prompt for type commands on local system.

Reference:
http://www.cyberciti.biz/tips/tunneling-vnc-connections-over-ssh-howto.html
http://www.positon.org/post/Tunnel-SSH-inverse-pour-connexion-SSH-vers-une-machine-NAT%C3%A9e
http://www.study-area.org/tips/ssh_tips.htm

2013年1月3日 星期四

Linux 下如何在 VM 中連接 socket output

在 Ubuntu 下以 VirtualBox 為例,搭配  socat 套件使用 Fedora 17 的 serial console mode
  • 先確認系統中有 socat 套件。可用 sudo apt-get install socat 安裝
  • 『設定值』-> 『序列埠』: 啟用
  • 『連接埠號』選: COM1 (需對應後面的 boot parameter, COM1 為 ttyS0, COM2 為 ttyS1 , 類推)
  • 連接埠模式:選「主機管線」;不勾選「連接到現有設備/通訊端」(ps: v5.x 之前,需勾選『建立管線』);設定連接埠路徑 : /tmp/serial0 。設定如右。
  •  啟動 VM,此時 /tmp/serial0  這 socket 應該被建立
  • 在 host machine ,終端機下 socat unix-connect:/tmp/serial0 stdio,echo=0,raw ,會等待輸出
  • 在 guest machine 中,在開機參數中加入 console=ttyS0,115200n81 ( 或 38400,76800 , 若是用 Debian live-boot and live-config 的 live system , 則需再加 live-getty )
  • boot 並從 host 終端機使用 serial console



Ceasar's Photo

www.flickr.com