聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

十月 9, 2016

小惡魔AppleBOY
AppleBOY
小惡魔 – 電腦技術 – 工作筆記 – AppleBOY is about »

tag cloud

» 申請 Let’s Encrypt 免費憑證讓網站支援 HTTP2

Letsencrypt 寫這篇最主要推廣讓網站都支援 HTTPS 加密連線HTTP2 協定,對於網站為什麼要支援 HTTP2,可以直接參考 ihower 寫的說明文章,最近在玩 Facebook, Line, Telegram Bot 時,填寫 Webhook URL,都強制要填寫 https:// 開頭,所以更不能忽略 HTTPS 了。,去年底寫了一篇 Let’s Encrypt 開放申請免費 SSL 憑證 推廣 Let’s Encrypt 的貢獻,讓買不起憑證,又想玩看看 HTTP2 的開發者可以用很簡單的方式來安裝及自動更新憑證,而 gslin 大為了推廣 HTTPS 也做了一個網站教學,文章寫得相當清楚,支援 ApacheNginx 設定。

安裝方式

如果主機是使用 Amazone EC2,可以直接用 AWS Certificate Manager,用 AWS 的好處就是只要透過後台介面搭配 ELB 就可以直接設定好 HTTPS 對應到 EC2 主機,壞處就是直接被綁死,將來如果不要使用 AWS,要轉移機器會相當痛苦。所以本篇會紀錄如何用 Nginx 搭配 Let’s Encrypt。為了方便部署機器,我們選用 dehydrated 來設定 Let’s Encrypt,好處就是不用安裝 Python 套件,官方網站提供的安裝方式需要安裝 Python 相關環境。透過 wget 將 dehydrated 安裝到 /etc/dehydrated/ 底下
$ mkdir -p /etc/dehydrated/
$ wget https://raw.githubusercontent.com/lukas2511/dehydrated/master/dehydrated -O /etc/dehydrated/dehydrated
$ chmod 755 /etc/dehydrated/dehydrated

建立設定檔

建立 dehydrated config 設定檔
$ echo "WELLKNOWN=/var/www/dehydrated" > /etc/dehydrated/config 
$ mkdir -p /var/www/dehydrated
Nginx 設定,先在 80 port 的 Server section 內寫入底下設定:
location /.well-known/acme-challenge/ {
  alias /var/www/dehydrated/;
}
可以先丟個檔案到 /var/www/dehydrated/ 確定網站可以正常讀取檔案,接著透過 dehydrated 指令產生 SSL 設定檔
$ /etc/dehydrated/dehydrated -c -d fbbot.wu-boy.com
執行上述指令會看到底下結果
# INFO: Using main config file /etc/dehydrated/config
Processing fbbot.wu-boy.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for fbbot.wu-boy.com...
 + Responding to challenge for fbbot.wu-boy.com...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
最後在設定一次 nginx
server {
  # don't forget to tell on which port this server listens
  listen 80;

  # listen on the www host
  server_name fbbot.wu-boy.com;

  # and redirect to the non-www host (declared below)
  return 301 https://fbbot.wu-boy.com$request_uri;
}

server {
  listen 0.0.0.0:443 ssl http2;
  server_name fbbot.wu-boy.com;

  location /.well-known/acme-challenge/ {
    alias /var/www/dehydrated/;
  }

  ssl_certificate /etc/dehydrated/certs/fbbot.wu-boy.com//fullchain.pem;
  ssl_certificate_key /etc/dehydrated/certs/fbbot.wu-boy.com/privkey.pem;
  location / {
    proxy_pass http://localhost:8081;
  }
}
上面是將 80 port 自動轉到 https,如果下次要重新 renew 的時候才不會又要打開 80 port 一次。

加入 Cron 設定

每天半夜可以自動 renew 一次,請參考 https://letsencrypt.tw/ 最後章節
0 0 * * * root sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400); ( /etc/dehydrated/dehydrated -c -d fbbot.wu-boy.com; /usr/sbin/service nginx reload ) > /tmp/dehydrated-fbbot.wu-boy.com.log 2>&1

後記

除了這方法之外,也可以使用 Certbot 來自動更新憑證,但是這方式就是要安裝 Python 環境,不過也不是很難就是了,可以直接參考這篇『NGINX 使用 Let’s Encrypt 免費 SSL 憑證設定 HTTPS 安全加密網頁教學』。結論就是你可以在網路上找到超多種方法來申請 Let’s Encrypt 憑證,就找到自己覺得不錯的方法即可,而我是認為不用安裝 Python 環境的方式最適合部署了。

十月 5, 2016

小惡魔AppleBOY
AppleBOY
小惡魔 – 電腦技術 – 工作筆記 – AppleBOY is about »

tag cloud

» SSH agent forwarding 教學

2016.11.13 Update: SSH Agent Forwarding 有安全性問題,請用 ProxyCommand 取代,請參考 SSH Agent Forwarding considered harmful Screen Shot 2016-10-05 at 9.26.13 AM SSH agent forwarding 可以讓開發者將 Local 端的 SSH Key Pair 帶到另外一台機器進行傳送,也就是說你不用將 SSH Key 複製到遠端 Server 再進行跳板動作,原本在 AWS 維護多台 EC2 主機,都會固定有一台跳板機,大家都把自己需要登入遠端機器的 SSH Key 複製到跳板機,這做法其實沒有很安全,又需要多下一個指令進行跳板。

個人電腦 —-> EC2 跳板機 —-> EC2 Server
大家都會把 Key Pair 存放到跳板機,安全性堪憂,只要這台主機被 Hack,或者是內部員工登入,拿別人的 Key Pair 登入其它主機,不就可以搞破壞?所以此篇教學主要教大家如何設定 SSH agent forwarding,讓憑證只存放在自己電腦,而不需上傳到 EC2 跳板機。這樣跳板機就真的只是跳板機,不需要存放任何憑證資料,每小時設定清空 Ubuntu User 家目錄,避免內部員工放個人資料或憑證,提升主機安全性。

將 Key Pair 放到清單

透過 ssh-add 指令將 Private Key Pair 加入清單
$ ssh-add ~/.ssh/keys/labs.pem
透過底下指令可以看到清單列表
$ ssh-add -L
這邊注意可以將所有機器的 key pair 都放到 ~/.ssh/keys 目錄,並且設定 400 權限

設定 ~/.ssh/config

方法一: 設定 ~/.ssh/config 檔案,每個 Host 都加上 ForwardAgent yes 參數 (此方法並不安全,請參考 SSH Agent Forwarding considered harmful)
Host aws
  HostName 10.130.xxx.xxx
  User ubuntu
  ServerAliveInterval 60
  ForwardAgent yes
  UseRoaming no
  IdentityFile ~/.ssh/keys/aws.pem
最後執行底下指令就可以直接跳到您要的 EC2 Server
$ ssh -t aws 'ssh example.inc'
方法二: 也是設定 ~/.ssh/config,但是透過 ProxyCommand 而不是 ForwardAgent yes (建議使用此方法)
Host hosta
  User userfoo
  Hostname 123.123.123.123

Host hostb
  User userbar
  Hostname 192.168.1.1
  Port 22
  ProxyCommand ssh -q -W %h:%p hosta
  IdentityFile ~/.ssh/keys/xxxx.pem
ProxyCommand 也不用將 pem 透過 ssh-add 匯入,省下一步指令,接著執行底下指令就可以 ssh 到指定機器,跟方法一比起來更安全又快速
$ ssh hostb
不用再跳板機多下一個 SSH 登入指令,蠻方便又安全。內部 Host Name 可以透過設定 AWS Private Hosted Zones

五月 28, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 – 電腦技術 – 工作筆記 – AppleBOY is about »

tag cloud

» 在 Fedora 或 Amazon Linux AMI 架設 Nginx + PHP FastCGI

799px-Amazon.com-Logo.svg

上一篇介紹如何在 Ubuntu 底下安裝 Nginx + PHP FastCGI,這次來紀錄如何安裝在 Fedora 系統,目前環境是使用 Amazon Linux AMI,如果有在玩 AWS EC2 或是 Fedora Linux 的話,對這 OS 就不會很陌生了。

安裝 Nginx

用 yum 升級系統所有套件,再安裝 Nginx + PHP 環境

$ yum update
$ yum install nginx php-cli php spawn-fcgi

將 Nginx 加入開機自動執行,並且啟動它

$ chkconfig --level 35 nginx on
$ service nginx start

設定 Nginx

Nginx 設定檔預設放在 /etc/nginx/nginx.conf,如果看過此設定檔你會發現跟 Ubuntu 安裝不同的地方在於這裡沒有 sites-availablesites-enabled 目錄,當然我們可以自行去設定

mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled

接著修改 /etc/nginx/nginx.conf 加入底下設定

# Load virtual host configuration files.
include /etc/nginx/sites-enabled/*;

如果覺得這步驟很麻煩的話,可以直接修改 /etc/nginx/conf.d/default.conf,這檔案就是 Nginx 預設的 Virtual Host 設定,如果要增加網站,就可以直接建立新檔案 /etc/nginx/conf.d/www.example.com.conf,接下來設定單一網站,設定檔內容如下

server {
    server_name www.example.com;
    listen 8090;
    access_log /var/log/nginx/example/logs/access.log;
    error_log /var/log/nginx/example/logs/error.log;
    root /home/www/appleboy;

    location / {
        index index.php index.html index.htm;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /home/www/appleboy$fastcgi_script_name;
    }
}

存檔後,記得建立 logs 目錄,Nginx 不會自動幫忙建立

mkdir -p /var/log/nginx/example/logs/

如果您想跟 Ubuntu 一樣的建立 Virtual Host,請執行底下步驟

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

最後重新啟動 Nginx

service nginx restart

建立 PHP Fast CGI 環境

我們透過 spawn-fcgi 來管理 CGI process,避免 PHP5-CGI 突然掛掉。首先建立 /usr/bin/php-fastcgi 檔案,內容如下

#!/bin/sh
/usr/bin/spawn-fcgi -P /var/run/php-cgi.pid -a 127.0.0.1 -p 9000 -C 15 -u nginx -g nginx -f /usr/bin/php-cgi

建立 /etc/rc.d/init.d/php-fastcgi 開機執行 php fastcgi

#!/bin/sh
#
# php-fastcgi - Use PHP as a FastCGI process via nginx.
#
# chkconfig: - 85 15
# description: Use PHP as a FastCGI process via nginx.
# processname: php-fastcgi
# pidfile: /var/run/php-cgi.pid
# modified: Bo-Yi Wu <appleboy.tw AT gmail.com>

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

phpfastcgi="/usr/bin/php-fastcgi"
prog=$(basename php-cgi)

pidfile="/var/run/${prog}.pid"
lockfile="/var/lock/subsys/${prog}"
STOP_TIMEOUT="10"

start() {
    [ -x $phpfastcgi ] || exit 5
    echo -n $"Starting $prog: "
    daemon --pidfile=${pidfile} ${phpfastcgi}
    retval=$?
    echo
    [ $retval -eq 0 ] && touch ${lockfile}
    return $retval
}

stop() {
    echo -n $"Stopping ${prog}: "
    killproc -p ${pidfile} -d ${STOP_TIMEOUT} ${prog}
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -rf ${lockfile} ${pidfile}
    return $retval
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading $prog: "
    killproc $prog -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    reload)
        reload
        ;;
    force-reload)
        force_reload
        ;;
    status)
        status -p ${pidfile} $prog
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
        exit 2
esac

更改 /etc/rc.d/init.d/php-fastcgi 檔案權限

chmod +x /etc/rc.d/init.d/php-fastcgi

加入開機自動執行

$ chkconfig --add php-fastcgi
$ chkconfig php-fastcgi on
$ /etc/init.d/php-fastcgi start

打開瀏覽器看有沒有正確看到 phpinfo();

Related View

十月 7, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 – 電腦技術 – 工作筆記 – AppleBOY is about »

tag cloud

» AWS 機器上 duplicated RPM 問題

AWS-logo

昨天幫忙升級全部 AWS RPM 套件,升級過程本來很順利,不過不知道哪一個 RPM 造成 SSH 全面斷線,接著我直接到 AWS Management Console 把機器 restart,登入系統之後下 yum update,直接給我噴出底下錯誤訊息

---> Package zlib.i686 0:1.2.3-24.7.amzn1 will be updated
---> Package zlib.i686 0:1.2.3-25.8.amzn1 will be an update
--> Finished Dependency Resolution
 You could try using --skip-broken to work around the problem
** Found 155 pre-existing rpmdb problem(s), 'yum check' output follows:
audit-libs-2.1-5.15.amzn1.x86_64 is a duplicate with audit-libs-2.0.4-1.14.amzn1.x86_64
authconfig-6.1.12-5.14.amzn1.x86_64 is a duplicate with authconfig-6.1.4-6.13.amzn1.x86_64
basesystem-10.0-4.9.amzn1.noarch is a duplicate with basesystem-10.0-4.8.amzn1.noarch
bash-4.1.2-8.14.amzn1.x86_64 is a duplicate with bash-4.1.2-3.13.amzn1.x86_64
binutils-2.20.51.0.2-5.20.17.amzn1.x86_64 is a duplicate with binutils-2.20.51.0.2-5.12.15.amzn1.x86_64
cloud-init-0.5.15-16.amzn1.noarch is a duplicate with cloud-init-0.5.15-8.amzn1.noarch
coreutils-8.4-13.13.amzn1.x86_64 is a duplicate with coreutils-8.4-9.12.amzn1.x86_64
coreutils-libs-8.4-13.13.amzn1.x86_64 is a duplicate with coreutils-libs-8.4-9.12.amzn1.x86_64
cpp-4.4.5-6.35.amzn1.x86_64 is a duplicate with cpp-4.4.4-13.33.amzn1.x86_64


看到上面問題其實也不用訝異,因為就是升級過程如果遇到重新開機,就會變成這樣,那該如何修復這些套件呢,想當然就是要移除 duplicate 的套件,網路上在 Frodra Forum 找到一篇解法 HOWTO: Remove older duplicated RPMs automatically,請按照底下方式來解決此問題:

# 首先安裝 yum-utils 套件
yum install yum-utils
# 執行 clean duplicate package
package-cleanup --cleandupes

執行完上面步驟,在接著把沒有安裝的 RPM 繼續安裝,透過 yum update 即可。

Related View

support:

biggo.com.tw

A Django site.