over 1 year ago

在本地端先將資料製成壓縮檔,但要記得排除node_modules

tar --exclude='./node_modules' -zcvf ./server.tgz .

用scp將檔案上傳至伺服器

scp -i ${Your.pem} ./server.tgz ubuntu@${server_ip}:${你要的路徑}

以下皆在伺服器上
進入上傳檔案的路徑,接著解壓縮

tar -zxvf server.tgz

安裝NodeJS版本6與NPM,因為我習慣使用Yarn,所以接著將Yarn安裝於全域中

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install yarn -g
yarn install

接著安裝Mongo DBRedis DBNginx,在此特別要讚賞Digital Ocean雲端平台服務商,網站上有大量的伺服器安裝教學,基本上都只要Copy&Paste就好。

我上傳後才發現一些路徑與參數都已經寫死成localhost,這裡有些需改成伺服器的ip,所以我就統統改用process.env,那在ubuntu中,為了讓環境變數永久存在,所以特別寫入/etc/profile.d,記得寫入後要source /etc/profile重啟,此時才會生效。

sudo nano /etc/profile.d/server-env.sh

// 內容樣式,`curl ipinfo.io/ip`會自動抓取public IP,如果有網域名就自己換,避免OAUTH的Callback路徑錯誤
export SERVER_URL=`curl ipinfo.io/ip` 
export JWT_SECRET='helloworld'
export SESSION_SECRET='yoyotv'

source /etc/profile

接著啟動 node server.js,檢查是否運作正常
下一步配置Nginx,因為專案有用到websocket,所以需要稍微改一下基本的配置,另外加上gzip壓縮功能、傳送靜態文件與HTTPS[註]
附上參考資料Nginx Caching加速nginx: 开启gzip和缓存

server {
       listen         80;
       server_name    yuanchieh.com;
       return         301 https://$server_name$request_uri;
}
server {
        listen 443;
        
        keepalive_timeout 70;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; pr$
        ssl_certificate     yuanchieh.com.crt;
        ssl_certificate_key yuanchieh.com.key;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+EC$

        gzip on;
        gzip_comp_level 2;
        gzip_min_length  500;
        gzip_buffers  4 32k;
        gzip_types text/plain application/javascript application/x-javascript text/cs$
        
            server_name yuanchieh.com;

        location / {
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_pass http://localhost:8080;
        }

        location = /{
                rewrite ^ /index.html break;
        }

        location ~* \.(html)$ {
                expires      1h;
        }
        location ~* \.(gif|jpg|jpeg|png|ico)$ {
                expires      7d;
        }
        location ~* \.(css|js)$ {
                expires       7d;
                access_log off;
                add_header Cache-Control "public, no-cache";
        }
}

這裡記得 編輯的Nginx的配置文檔通常都是放在/etc/nginx/sites-availabel底下,再透過sombolic link到/etc/nginx/sites-enable下,所以要修改就改前者即可,別忘了還要service nginx restart。

後來到SSL Lab測試HTTPS強度發現忘了加中繼憑證,到憑證商(我的是Godday)下載中繼憑證並直接加到原本的憑證後cat 中繼憑證.crt > 伺服器憑證.crt

AWS Ubuntu伺服器安全配置

主要參考幾份文章Ubuntu Server Secure – A script to secure and harden UbuntuMy First 5 Minutes On A Server; Or, Essential Security for Linux Servers,針對Ubuntu做的安全防護措施,大約有以下幾點

  1. 禁止Root登入,創建新的使用者並賦予Sudo權限與SSH登入私鑰
    首先創建新角色 deploy,並創建使用者的根目錄與放置ssh私鑰的資料夾
    useradd deploy
    $ mkdir /home/deploy
    $ mkdir /home/deploy/.ssh
    $ chmod 700 /home/deploy/.ssh
    加入私鑰,直接如果不知道請搜尋 'ubuntu設定ssh連線'
    $ vim /home/deploy/.ssh/authorized_keys
    修改資料夾全線只有擁有者可讀,也就是deploy而已,接著將/home/deploy包含底下所有資料擁有者、全組都改成deploy
    $ chmod 400 /home/deploy/.ssh/authorized_keys
    $ chown deploy:deploy /home/deploy -R
    設定deploy密碼
    $ passwd deploy
    修改sudo群組,讓deploy也擁有全部權限
    $ visudo
    加入
    root    ALL=(ALL) ALL
    deploy  ALL=(ALL) ALL
    讓Root不能登入,而且也不能用密碼登入(密碼可靠性總不如Key啊),第三行限制ip就見仁見智 $ vim /etc/ssh/sshd_config 加入 PermitRootLogin no PasswordAuthentication no AllowUsers deploy@(your-ip) deploy@(another-ip-if-any) 別忘記重新啟動 $ service ssh restart 增加破解障礙 有些人會用bot隨意連線伺服器並探索漏洞,所以將預設的SSH port22修改至其他的port可以增加安全性,有強者寫出了TOTP SSH port fluxing,透過二階段認證TOTP,動態變更port並發送訊息到綁定手機,太天才啦XD
  2. 確認每個資料夾與檔案的權限
  3. 隨時更新所需的軟體
    安裝unattended-upgrades自動更新package
    $ apt-get install unattended-upgrades
    $ vim /etc/apt/apt.conf.d/10periodic
    加入
    APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Download-Upgradeable-Packages "1";
    APT::Periodic::AutocleanInterval "7";
    APT::Periodic::Unattended-Upgrade "1";
    如果是在AWS Ubuntu中,預設就是如此
    $ vim /etc/apt/apt.conf.d/50unattended-upgrades
    加入
    Unattended-Upgrade::Allowed-Origins {
        "Ubuntu lucid-security";
    //      "Ubuntu lucid-updates";
    };
    
  4. 使用防火牆與相關軟體,擋住不必要的port 網路上大多數使用ufw套件,基本上就是將需要的port打開其他關閉,此時設定有分成兩種
    對外公開沒有限制進入ip
    $ ufw allow 80   //HTTP
    $ ufw allow 443  //HTTPS
    限制進入ip
    $ ufw allow from {your-ip} to any port 22
    // 如果有資料庫等,也應該限制API Server能夠連線,確保安全
    $ ufw allow from {your-ip} to any port 6379
    $ ufw enable
    在AWS EC2中,你可以直接設定container的security group,道理是一樣的。
    
  5. 其他
    使用logwatch,有任何人登入伺服器都會發送Email通知
    $ apt-get install logwatch
    $ vim /etc/cron.daily/00logwatch
    加入
    /usr/sbin/logwatch --output mail --mailto test@gmail.com --detail high
    
常用指令

// 查看版本

lsb_release -a

//刪除佔用port的工作

sudo kill $(sudo lsof -t -i:8080)

帶優化
  1. 如果有使用Fontawesome之類,可以改到Fontello去下載只需要的icon,大幅減少下載量。
  2. 再Nginx原始配置文件中有提到使用HTTPS下不要開啟GZip,否則容易遭受攻擊,我網路搜尋結果大多解法為將靜態文件與API伺服器分開再不同Domain下。
  3. 只要伺服器還在跑,對於網站安全就不能有一絲鬆懈,網站優化也是。
← Redux Saga實戰分享與API使用範例 網站表單傳送安全配置-使用csrf token與reCAPTCHA防堵csrf攻擊 →
 
comments powered by Disqus