新增 Apache2 VirtualHost 使用子網域以及 Freenom 免費網域的申請

最近正在煩惱著該如何部署 Laravel 到專案的子目錄下,比如說,請求的網址:http://localhost/blog 而不是 http://localhost

使用 .hatcess 之後,還是無法設定成功,讓網址可以導向到請求專案的根目錄名稱一樣也可以成功。

目前也有人有這樣的問題,於是有人在 Laravel 的 Github 的專案上開了這樣的 issue: https://github.com/laravel/framework/pull/3918 問題也是跟我相同,需要請求網址的時候可以多一個專案根目錄名稱。

目前比較好的作法是使用:Apache2 的 VirtualHost 來解決這個問題,透過設定 VirtualHost 可以解決請求網址包含專案名稱的問題。下面的教學為使用 Apache2 VirtualHost 並搭配 Freenom 免費的頂級網域名稱來做到。

作業系統:LUbuntu 16.04 LTS

[Freenom 免費頂級網域申請]

  1. 進入 freenom.com 網站。
  2. 輸入一個沒有人註冊的網域名稱並按下『檢查可用性』,如下圖。
    %e5%bf%ab%e7%85%a710
  3. 註冊或登入一個帳號,並成功拿到網域之後,進到如下的畫面:點選 My Domain 接著選擇 Manage Domain。
    %e5%bf%ab%e7%85%a711
  4. 選擇 tab 名稱:Manage Freenom DNS
    %e5%bf%ab%e7%85%a713
    在『Add record』的部份新增一個 A 紀錄,紀錄 ipv4 位址。Name 空白以及在 Target 的地方,填寫自己的固定 ip 位址所以只適合 VPS 或實體有固定 ip 的主機。(TTL 數值可以用預設就好,不用修改它)
  5. 填寫完成之後,按下 Save Changes 按鈕,等一段時間之後,就會出現『Record added successfully 』就代表成功加入一筆紀錄了。
  6. 增加完 A 紀錄之後,就可以知道使用網域名稱來 request url 而且不需要打 ip 位址了。
  7. 接著再新增 CNAME 紀錄,用來做子網域使用,讓外面連進來的人也可以使用子網域連線(搭配 VirtualHost 使用)。
  8. 新增 CNAME 紀錄範例如下圖:
    %e5%bf%ab%e7%85%a714

[VirtualHost 設定]

  1. 需要先安裝好 Apache2 或是 LAMP server 可以參考之前的文章
  2. 照下面新增一個目錄(以 blog.peter279k.tk)
    sudo mkdir -p /var/www/blog.peter279k.tk/html
    
  3. 設定 permissions 權限,這裡可以將使用者權限設定成:www-data
    sudo chown -R www-data /var/www/blog.peter279k.tk/html
    
  4. 編輯一個測試的設定 HTML 檔。
    vi /var/www/blog.peter279k.tk/html/index.html
    
    <html>
    <head>
    <title>Welcome to Example.com!</title>
    </head>
    <body>
    <h1>Success! The example.com virtual host is working!</h1>
    </body>
    </html>
    
    sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/blog.peter279k.tk.conf
    
    # blog.peter279k.tk.conf
    <VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com
    
    ServerAdmin admin@blog.peter279k.tk
    ServerName blog.peter279k.tk
    ServerAlias www.blog.peter279k.tk
    DocumentRoot /var/www/blog.peter279k.tk/html/blog/public
    
    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    <Directory "/var/www/blog.peter279k.tk/html/blog/public">
    AllowOverride All
    </Directory>
    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
    </VirtualHost>
    
    

    DocumentRoot 和 Directory 需要指定自己的 folder 指定到哪個目錄,網域名稱也需要改成自己改的名稱。

  5. 啟動 site 並重新啟動 Apache2 服務,即完成了。
    sudo a2ensite blog.peter279k.tk.conf
    sudo systemctl restart apache2
    

VirtualHost 設定參考文章:https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts

安裝 Laravel 初始化的框架

雖然有一些方便的套件可以安裝 Laravel 像比如說:Wagon , homestead 等。不過,客製化的安裝還是很重要的。接下來的教學,是分別在 Window 以及 Linux 下去安裝 Laravel 。

[1] Linux/Ubuntu

前置作業:

  1. 已經有 LAMP server 或是 LNMP server 作為架站的環境。
  2. 有 cURL 指令。
  3. 有 php5-cli (或 php-cli)。看作業系統發行版本而套件名稱有所不同。(16.04 LTS 與 14.04LTS 的差別)

安裝 Laravel:

切換到 www (Document Root) 或是自己的家目錄。

[第一步]

下載 Composer

curl -sS https://getcomposer.org/installer | php

create project for Laravel scaffold 產生專案的骨架(scaffold) application.


php composer.phar create-project laravel/laravel project-name "5.3.*" --prefer-dist

#或者版本號字串不加,直接自動去偵測合適的版本。

php composer.phar create-project laravel/laravel project-name --prefer-dist
#版本部份可以自由選擇,建議是使用 5 以上的版本。 

[第二步]

打開瀏覽器輸入:localhost/project-name/public 就可以看到下面的截圖了。

 

[2] Windows

前置作業:

  1. 已經安裝好有 XAMPP 或 WAMP 或 EasyPHP
  2. 安裝好 Git for Windows,若沒有請到這裡下載。
  3. 已經設定好 git-bash 的 .bashrc 設定 alias 與 指令記憶。
  4. 若第 3 項沒有設定,請做這一項設定。
    bind '"\x1b\x5b\x41":history-search-backward'
    bind '"\x1b\x5b\x42":history-search-forward'
    

    可能第一次開啟 git-bash 的時候,會有 Warning 出現。

    WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile.
    

    當關掉再重開 git-bash 之後,就會沒有這行警告了。

    設定 alias 編輯 .bashrc 檔

    alias php='/path/to/php'
    

    重開 git-bash 就會生效了。

安裝 Laravel:

[第一步]

下載 Composer

curl -sS https://getcomposer.org/installer | php

create project for Laravel scaffold 產生專案的骨架(scaffold) application.

# 使用 --prefer-dist 選項來減少安裝的時間。
php composer.phar create-project laravel/laravel "5.3.*" project-name --prefer-dist

#版本部份可以自由選擇,建議是使用 5 以上的版本。

第一次做上面的步驟的時候,會發現有下面的錯誤:

Script php -r "copy('.env.example', '.env');" handling the post-root-package-install event returned with an error

如下錯誤截圖
%e5%bf%ab%e7%85%a73

這時候需要去複製 .env.example 到 document root 的目錄下,讓其可以抓到檔案,算是 Windows 下才產生的問題,而不會顯示 no such file or directory 的錯誤。
接著把專案 project-name 整個刪除,在重新安裝一次,就會成功了。

如果這一步還是無法成功的話,因為還需要將 PHP 執行的路徑加入至系統環境變數;加入之後,須重新開機。

%e5%bf%ab%e7%85%a77


# 可以參考 composer.json 裡的 scripts 的 key 所定義的 post-scripts 裡面都需要執行到。

php -r "file_exists('.env') || copy('.env.example', '.env');"

php artisan key:generate

php artisan optimize

[第二步] 啟動 development server


php artisan serve

打開瀏覽器輸入:localhost/project-name/public 就可以看到下面的截圖了。

以上就是各個不同作業系統平台安裝 Laravel 的不同方法。

[Laravel 5.1 and 5.2 預設的畫面]

%e5%bf%ab%e7%85%a74

 

[Laravel 5.3 預設的畫面]

%e5%bf%ab%e7%85%a75

 

[後記]

因為 Larvel 很吃版本,所以需要注意。

Laravel 5.1 與 5.2 需要 PHP 5.5 以上的版本。

Laravel 5.3 需要 PHP 5.6 以上的版本。

在虛擬共享主機上使用 Git 版本控制專案

一般在使用 Git 作為版本控制與部署專案時,都是使用指令居多,很少會使用像是檔案傳輸等方式部署,而且用檔案方式部署我們不太能知道哪些檔案已經傳過,或是還沒有傳上去等。

有鑑於這個問題,我們在使用只提供 FTP/FTPS 等檔案傳輸協定傳輸檔案的共享主機(shared hosting)時,可以使用 git-ftp 來幫我們完成 deployment 的任務。

本篇文章,就是要來介紹與使用 git-ftp 來幫助我們達成這項任務。

初始化一些 Git 指令的設定(環境設定)


git config --global user.email "your-mail-address"

git config --global user.name "your-user-name"

git config --global core.editor "vim"

git config --global color.ui true

git config --global alias.lg "log --color --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"

先建立一個 hello-world 的專案


mkdir hello-world

cd hello-world

git init

echo "<?php echo 'hello world'; ?>" > index.php

git add .

git commit -m "initial commit"

下載 git-ftp 套件來安裝。

照著 官方 INSTALL.md 加入 ppa repository


sudo add-apt-repository ppa:resmo/git-ftp
sudo apt-get update

可以參考官方的安裝教學文件,本篇使用 Linux Ubuntu 與Windows 來進行安裝。這時候可能會在 sudo apt-get update 時,發現 Package 的 source ppa 發生 404 Not found 的現象。


W: 無法取得 http://ppa.launchpad.net/resmo/git-ftp/ubuntu/dists/wily/main/binary-amd64/Packages,404 Not Found

W: 無法取得 http://ppa.launchpad.net/resmo/git-ftp/ubuntu/dists/wily/main/binary-i386/Packages,404 Not Found

E: Some index files failed to download. They have been ignored, or old ones used instead.

[Ubuntu]

為了避免這種情形的發生,因此需要自己手動安裝 deb package。因此需要自己前往這個網站:https://launchpad.net/ubuntu/+source/git-ftp

目前的新版本為:1.2.0-1 可以使用這個版本,並下載:git-ftp_1.2.0-1_all.deb 檔案。下載回來之後,便雙擊安裝了。安裝好之後,就有 git-ftp 的指令可以使用了。如下:

%e5%bf%ab%e7%85%a71

 

[Windows]

一開始需要先安裝 Git for Windows (mysysgit)。安裝過程中,可以都用預設,唯一可以自己更改安裝的路徑,需要自己去注意一下。

安裝好之後,回到 Windows 桌面,並點滑鼠右鍵,這時會多一個:Git Bash here 的選項可以選擇。接著可以執行下面的步驟:

 

cd ~
git clone https://github.com/git-ftp/git-ftp git-ftp.git
cd git-ftp.git && chmod +x git-ftp
cp ~/git-ftp.git/git-ftp /bin/git-ftp

可以參考下面安裝示意圖:
%e5%bf%ab%e7%85%a72

[使用方法]

[init] 第一次把專案透過 git-ftp 放到 FTP/FTPS sever 上。

git-ftp init -u "your-account-name" -p "your-password" - ftpes://peter.nctu.me/web/peter.nctu.me/public_html/hello-world

[push] 已經 init 過,需要去更新 server 上面的檔案(使用 push 推上更新過後的 commit git-ftp 會自己自動比對版本做更新檔案的動作。)

git-ftp push -u "your-account-name" -p "your-password" - ftpes://peter.nctu.me/web/peter.nctu.me/public_html/hello-world

[.gitignore 問題] 若是有些 library 檔案,像使用 PHP Composer 則需要去控制 dependency package. 這些 package 並不會進到版本控制中。而且在用 git-ftp 時,
也會參考 .gitignore 的檔案。若要解決這個問題,需要在專案的目錄底下新增:.git-ftp-include 作為宣告,這一些檔案或目錄,需要一併 push 上去。

下面是 .git-ftp-include 的內容。(當然這個檔案也可以加到版本控制中,讓人方便部署,也知道該部署什麼額外的目錄上去。)

!vendor/
!token/
!bower_components/

這樣之後在 push 的時候,就不會因為 library 目錄 被 ignore 而去忽略沒有上傳到了。

2018/01/18 更新

更新關於使用git-ftp走sftp協定來部署的方式。

git-ftp如果要走sftp的協定做部署的話,需要預先安裝好libcurl-dev以供支援。

可以的話,也可以順便把curl套件安裝起來,因為這是一個蠻好用的指令在對網址請求的時候很好使用。下面預先假設是用Linux Ubuntu 16.04作為示範。

在執行安裝套件之前,都先需要更新鏡像的來源:


sudo apt-get update

安裝curl套件


sudo apt-get install curl

安裝libcurl-dev


sudo apt-get install lib-curl-dev

這個時候,會跳出這是一個虛擬套件的名稱等字樣,如下圖所示:

我們選圖中第一個作為我們要安裝的套件名稱。


sudo apt-get install libcurl4-openssl-dev

接下來按照下面的指令步驟去執行,到編輯rules檔案時為止。

在rules檔案編輯,我們依照下列圖片中的方式進行編輯:

注意

有一點需要注意的是,因為重新編譯curl時所需要用到的openssl為舊版的。

使用新版的時候,在rebuild-package的時候會不成功。因此需要將openssl版本降級。下列是相關的原因。

against OpenSSL 1.1.0. This won’t work. You need 1.0.2 or earlier. The OpenSSL guys changed the API on 1.1.0.

若沒有把openssl的套件版本降級的話,將會出現像下列那樣的錯誤:


dereferencing pointer to incomplete type ‘EVP_PKEY {aka struct evp_pkey_st}’
if (pk->type == EVP_PKEY_RSA &&

降級openssl 相關package的方法


# 在第24行時,先去確認openssl版本是否為1.0.2的版本,若不是,需要做下面降級的動作

apt-get update

apt-get install openssl=1.0.2g-1ubuntu4.10

apt-get install libssl-dev=1.0.2g-1ubuntu4.10

apt-get install libssl1.0.0=1.0.2g-1ubuntu4.10

# 接著在從build_sftp_curl.sh中的第25行繼續

最後檢查curl是否有支援sftp協定,如果有的話,會像下面的示意圖一樣,在protocols那裡多了一個叫做:『sftp』

測試是否可以正常運行

試著執行下面的命令


git-ftp init -u "user-name" -p "your-password" - sftp://45.77.107.31/home/root

萬一有錯誤的話,但是錯誤的資訊太少,則可以加入下列參數加以使用,並看到更多的訊息。


git-ftp init -u "user-name" -p "password" - sftp://45.77.107.31/home/root -vv

如果正常的話,就可以下面的截圖一樣,成功的把專案部署到指定的server上了。

 

VESTA Control Panel 教學與體驗

最近台東大學的虛擬主機開張了,身為校友的我,當然要去體驗看看,所以我就申請了一組帳號來玩看看。申請的步驟在此篇文章就不多作說明了,有興趣想要申請的,可以參考下列的文章:

https://www.csie.nttu.edu.tw/%E7%9B%B8%E9%97%9C%E6%9C%8D%E5%8B%99/%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F%E6%9C%8D%E5%8B%99/

裡面有詳細的範例教學。教你如何申請,使用 FTP 以及安裝 WordPress。本篇的教學是要教你更進一步的使用。(下面項目不定期更新~)

[1] 使用版本控制,讓共享虛擬主機也有版本控制:git-ftp, ftp-deployment

[2] Deployment: 部署專案上去,含有 PHP 框架的專案:Slim, Laravel, Nette, Symfony, silex and so on.

[3] 小玩 Python , 使用 Python CGI.

[4] 其他,想到再補充。

hitcon-ctf-2016-papapa 建置環境

HITCON CTF 2016 已經出來了。現在可以在 Github 的 Orange 大大的帳號中的 repo 找的到。這是其中一題的重現環境的 server 建置

首先,要先有一台 server (或是使用 VPS) 接著上面已經安裝好 LAMP stack (或PHP + Apache) 推薦的 Linux Distribution 為 Ubuntu 14.04 LTS

接著到專案的網址:把 repository clone 回來。

git clone https://github.com/orangetw/My-CTF-Web-Challenges.git

接著,把目錄 hitcon-ctf-2016/papapa/ 底下的移到 server 上,並修改 /etc/apache2/sites-available/000-default.conf
下面的設定檔將專案中的 default-ssl.conf 整併到 000-default.conf

sudo vi /etc/apache2/sites-available/000-default.conf

修改的範例檔如下:

# 基本上,前面的 80 port 是都不用更改的,使用預設的設定就好。

<IfModule mod_ssl.c>
 <VirtualHost *:443>
 ServerAdmin webmaster@localhost
 ServerName your-ip-address
 DocumentRoot /var/www/html/papapa
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 SSLEngine on
 
 SSLCertificateFile /path/to/crt-file
 SSLCertificateKeyFile /path/to/key-file

 SSLCACertificateFile /path/to/crt-file
 
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>
 <Directory "/var/www/html">
 AllowOverride All
 </Directory>

 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 # MSIE 7 and newer should be able to use keepalive
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
 <VirtualHost *:443>
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html/secret/
 ServerName very-secret-area-for-ctf.orange.tw


 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 SSLEngine on

 SSLCertificateFile /path/to/crt-file
 SSLCertificateKeyFile /path/to/key-file
 SSLCACertificateFile /path/to/crt-file

 <Directory /secret/>
 Options FollowSymLinks
 AllowOverride None
 Require all granted
 </Directory>


 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 # MSIE 7 and newer should be able to use keepalive
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

 </VirtualHost>
</IfModule>

設定完成之後,在 /var/www/html 的目錄下建立一個 secret 的目錄並把 index-secret.php 放到此目錄中。

重啟 Apache service


sudo service apache2 restart

接著:開始攻擊(?

開始攻擊時,先想辦法拿到:very-secret-area-for-ctf.orange.tw 這個網域名稱。

可以從主控台看到類似這樣的憑證圖示:

接著使用 cURL


curl -k -H "Host: very-secret-area-for-ctf.orange.tw" "https://your-ip-address/"