2019年12月4日 星期三

使用python透過firebase發送ios推播

為了簡化推播的困難度,通常會透過firebase等平台進行推播,以下為一段透過firebase後台送出推播到ios機器的sample:

from urllib import request
import json

to = <fmc token>
url = 'https://fcm.googleapis.com/fcm/send'
key = <firebase key>

headers = {
'Content-Type' : 'application/json',
'Authorization' : 'key=' + key,
}

data = {
  "to": to,
  "content_available" : True,
  "data": {
      'info' : 'data to background mode',
    },
  'notification' : {
    'title' : 'this is title',
    'body' : 'this is body',
  },
}

dataJson = json.dumps(data).encode('utf-8')

r = request.Request(url, dataJson, headers = headers)
result = request.urlopen(r)
result.getcode()

詳細的payload內容可以參考firebase的說明網頁:

Firebase Cloud Messaging HTTP protocol
https://firebase.google.com/docs/cloud-messaging/http-server-ref




2019年10月25日 星期五

centos 下 conda 使用簡易提示

conda env list => 列出已經有的環境
conda create --name <env> => 建立某個環境
conda create --name <env> python=3.7 => 指定python版本
conda env create --name <env> -f <yml file> => 依照指定環境建立
conda env remove --name <env> => 移除某個環境

source activate <env> => 切換到某個env
source deactivate => 離開env

切換到環境下,可以做下面的動作:
conda list => 列出安裝的package
conda env export --file <yml file> => 將環境設定輸出到 yml檔

2019年6月15日 星期六

centos7 架設 vsftpd (virtual user 使用 mysql 與 local account 並存)

先前使用過 mysql 當作帳號驗證,若想要混合 linux local account 及 mysql 中的帳號,需要考慮兩個部分。1. 登入認證。 2. 目錄及權限。

登入認證:
  考慮使用者先使用 mysql 驗證,若無法通過則使用原來的 linux 帳號認證,因此 pam 檔使用原先兩個 pam 混合。需要注意式 mysql 的部分,required 要更換成 sufficient,也就是 mysql 的認證通過後,就不再檢查後續的認證。

  編輯 pam 檔 /etc/pam.d/vsftpd_mix

#%PAM-1.0
auth       sufficient pam_mysql.so db=vsftpd user=vsftpd
  passwd=42fdsFDE3$ host=localhost table=accounts
  usercolumn=username passwdcolumn=password crypt=3
account    sufficient pam_mysql.so db=vsftpd user=vsftpd
  passwd=42fdsFDE3$ host=localhost table=accounts
  usercolumn=username passwdcolumn=password crypt=3
session    optional     pam_keyinit.so    force revoke
auth       required pam_listfile.so item=user sense=deny
  file=/etc/vsftpd/ftpusers onerr=succeed
auth       required pam_shells.so
auth       include password-auth
account    include password-auth
session    required     pam_loginuid.so
session    include password-auth

並在 vsftpd.conf 中,調整設定:

pam_service_name=vsftpd_mix

目錄及權限:
  原先使用 mysql 中 user時,vsftpd.conf 增加了以下設定:

virtual_use_local_privs=YES
guest_enable=YES
guest_username=vuser
user_sub_token=$USER
local_root=/home/vuser/$USER

這些項目僅能針對 virtual user,因此利用 user_config_dir的設定,依照登入帳號,如果是 local account,就反向取消這些設定。

vsftpd.conf 增加設定

user_config_dir = /etc/vsftpd/user_conf

在 /etc/vsftpd/user_conf 下面,針對每個 local account 增加設定檔,例如 local account : xyz
增加 /etc/vsftpd/user_conf/xyz,內容為

virtual_use_local_privs=NO
guest_enable=NO
user_sub_token=$USER
local_root=/home/$USER

PS:亦可反向思考,local account的設定寫在 vsftpd.conf中,每個 virtual user 建立一個檔案在 /user_conf 之下。可考慮哪種方式比較容易處理。

2019年5月15日 星期三

firewall-cmd 參數速記

*. zone name limited 17 chars
*. firealld-cmd 的參數:

共用參數
  --permanent 查詢、設定 硬碟中儲存的設定

zone查詢、設定相關
  --get-default-zone  查詢預設的zone
  --set-default-zone=... 指定預設的zone
  --get-zones 列出所有的zones
  --list-all-zones 列出所有zones的詳細設定
  --zone=... --list-all 指定對某個zone列出詳細設定

active zone相關
  --get-active-zones 查詢各網路介面運作中的zone
  --zone=... --change-interface=... 設定網路介面運作中的zone

service相關
  --get-services 列出已經定義的服務名稱
  --reload  重新讀入服務名稱。
    (user 可以在 /etc/firewalld/services下增加自己的service設定,
    可參考/usr/lib/firewalld/services下,原有的各種service寫法)
  --zone=... --list-services 列出zone目前打開firewall的服務
  --zone=... --add-service=... 增加打開firewall的服務
  --zone=... --remove-service=... 關閉firewall的服務
  --zone=... --add-port=[port,port-port]/['tcp','udp']  ...增加打開某個指定的port
  --zone=... --remove-port=[port,port-port]/['tcp','udp']  ...增加打開某個指定的port

連線過濾相關
  --zone=... --list-rich-rules 列出連線過濾設定
  --zone=... --add-rich-rule=... 增加連線過濾設定
  --zone=... --remove-rich-rule=... 刪除連線過濾設定
  sample:
    'rule family="ipv4" source address="192.168.111.0/24" port port="22" protocol="tcp" reject'
    'rule family="ipv4" source address="192.168.111.0/24" service name="http" accept'

2019年5月14日 星期二

lftp 使用簡介

lftp是linux上一套常用的ftp client軟體,支援FTP、SFTP、FTPS等。

假設抓取 readme.txt,結束後離開:
使用SFTP時:

lftp -e "get -c readme.txt; exit" -u <user>,<password> sftp://<domain or ip>

使用FTP時:

lftp -e "get -c readme.txt; exit" -u <user>,<password> ftp://<domain or ip>

使用FTPS時:

lftp -u <user>,<password> ftp://<domain or ip> -e "\
set ftp:ssl-force true; set ftp:ssl-protect-data true; set ssl:verify-certificate no;\
get -c readme.txt; exit"

PS:此時先使用FTP連上,再強制使用SSL傳遞帳密及資料。

2019年5月6日 星期一

centos7 架設 vsftpd (virtual user 使用 mysql)

接續上一篇的使用 db 檔案的方式,如果改用 mysql 儲存帳密,可調如下:

1. 安裝所需要的 pam_mysql.so
  可以從 source code 抓取 compile 安裝,或已經 build好的版本可以下載 :
  https://centos.pkgs.org/7/cheese-x86_64/pam_mysql-0.7-0.21.rc1.el7.x86_64.rpm.html

    wget http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64//pam_mysql-0.7-0.21.rc1.el7.x86_64.rpm
    rpm -Uvh ./pam_mysql-0.7-0.21.rc1.el7.x86_64.rpm

2. 請先裝好 mysql (可參閱其他文章),並建立 db 提供使用。
  假定建立 DB vsftpd 及 下面的 accounts table,並 grant 權限給 vsftpd 這個帳號,
  使用密碼 42fdsFDE3$ :
  
  CREATE TABLE `accounts` (
    userid int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(30) DEFAULT NULL,
    `password` varchar(50) DEFAULT NULL,
    primary key(userid),
    unique key(username)
  ) ENGINE=MYISAM;

  grant all on vsftpd.* to 'vsftpd'@'localhost' IDENTIFIED BY '42fdsFDE3$';

  PS:千萬記住,密碼不要用到#,以免PAM設定檔中,#後面被當作註解。

3. 編輯 pam 檔 /etc/pam.d/vsftpd_dbuser

  #%PAM-1.0
  auth required pam_mysql.so user=vsftpd passwd=42fdsFDE3$ host=localhost db=vsftpd   table=accounts usercolumn=username passwdcolumn=pass crypt=3
  account required pam_mysql.so user=vsftpd passwd=42fdsFDE3$ host=localhost db=vsftpd   table=accounts usercolumn=username passwdcolumn=pass crypt=3

  其中的 crypt=3,是指定 table 中密碼的欄位使用 md5( )運算,
  所以 insert 資料時記得使用類似下面sample:
  
  insert into accounts (username, pass) values ('user1', md5('paswd1'))

4. 完成就可以重啟 vsftpd 了。


2019年5月5日 星期日

centos7 架設 vsftpd (virtual user 使用 db 檔案)

如果僅是提供不同user上傳、下載資料,通常不會允許使用機器上的local user,
可以避免建立帳號時的麻煩還有帳號流出的可能。
此時會使用 virtual user,提供一個帳號認證系統,與 local user 分開。

vsftpd是使用 pam (Linux可插可拔的認証模組)來提供帳號認證,因此更換 pam的設定,
就可以達到使用virtual user的功能。

1. 編輯使用帳號密碼:
  編輯 /etc/vsftpd/vuser.txt,一行帳號,一行密碼,sample如下:

      user1
      123456
      user2
      abcdef

 轉換成 DB:

      db_load -T -t hash -f ./vuser.txt ./vuser.db

 PS:轉換後,可以透過 file來檢查檔案型態是否正確。(檔案型態,應該為 Berkeley DB )
    file vuser.db

2. 編輯 pam 檔
  pam檔通常都會集中在 /etc/pam.d 下面,
  此處編輯一個專用的的pam檔,/etc/pam.d/vsftpd_vuser,內容如下:

    #%PAM-1.0
    auth required pam_userdb.so db=/etc/vsftpd/vuser
    account required pam_userdb.so db=/etc/vsftpd/vuser

 指定認證及帳號的部分使用剛剛建立的 /etc/vuser.db

3. 修改 vsftpd.conf 設定

    pam_service_name=vsftpd_vuser
    virtual_use_local_privs=YES
    guest_enable=YES
    guest_username=vuser
    user_sub_token=$USER
    local_root=/home/vuser/$USER
 
設定了對應的 pam 到 /etc/pam.d/vsftpd_vuser,並啟用 virtual user的功能。
virtual user 會以 guest 的身分登入,其中:guest_username=vuser
,會把對應的 guest 帳號轉換成 local user 的帳號 vuser 來使用,
後端需要先用 linux adduser 來建立 vuser 帳號,
並可透過 vuser這個帳號從後端調整設定相關的檔案權限。
user_sub_token=$USER,指定了登入的識別使用db中的帳號,
local_root=/home/vuser/$USER,指定登入後的預設目錄(根目錄)。
如果是 user1 登入,預設目錄會在 /home/vuser/user1,
請記得針對每個人的預設目錄路徑,建立好相對的目錄,否則登入會找不到目錄失敗。


centos7 架設 vsftpd (ftps 與 pasv mode)

ftp登入時,會傳送帳密,即使資料沒有加密的必要,但帳密仍然需要安全。
因此建議使用 ftps (ftp 擴充 SSL 或 TLS) 的方式。
但因為使用不同的port傳輸,因此必須使用 pasv mode來開啟資料傳輸線,
因此也需要同時起用pasv mode。

1. 建立ssl的憑證:
  假設將憑證存放在 /etc/vsftpd/certs/vsftpd.pem,

  mkdir /etc/vsftpd/certs
  cd /etc/vsftpd/certs
  openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
  chmod 400 vsftpd.pem

  此處設定成只有root可以讀取憑證內容,避免憑證資訊外漏。

2. 調整設定檔:

  ssl_enable=YES
  require_ssl_reuse=NO
  rsa_cert_file=/etc/vsftpd/certs/vsftpd.pem
  rsa_private_key_file=/etc/vsftpd/certs/vsftpd.pem
  pasv_min_port=40100
  pasv_max_port=40200

其裝 pasv_min_port 與 pasv_max_port 的設定,是在pasv mode的設定。
傳輸資料時,server會在 pasv_min_port ~ pasv_max_port 之間開啟一個port來接收連線。

PS: require_ssl_reuse 預設 YES,有些client會不支援,因此設定NO。

3. 配合著使用ssl 及 pasv mode,需要調整firewall,把對應的port打開,
  其中 ftps的listen port 預設為990,及pasv mode需要40100~40200。

    firewall-cmd --zone=public --permanent --add-port=990/tcp
    firewall-cmd --zone=public --permanent --add-port=40100-40200/tcp
    firewall-cmd --reload

4. 完成設定後請記得重開 vsftpd 進行測是。FTP client 可以觀察到 SSL 或 TLS 的轉換訊息。

5. 增加僅能存取自己local目錄的安全限制:
   通常為了安全起見,會僅允許使用者存取自己的local目錄以下的東西。

   chroot_local_user=YES

   增加此項設定後,登入時,client可能會遇到錯誤訊息:

    ' 500 OOPS: chroot '

   來自於 SELINUX (Security-Enhanced Linux)的限制,需要做一下設定:

   使用getsebool 查看限制:
      getsebool -a | grep ftp

   通常 CentOS7 需要設定:

     setsebool -P ftpd_full_access on

   較早的linux 版本:

     setsebool -P ftp_home_dir 1
 
  接著可以登入後,可能會出現下面的錯誤訊息:

    '500 OOPS: vsftpd: refusing to run with writable root inside chroot()'

  請在  vsftpd.conf 增加

  allow_writeable_chroot=YES

6. 其他情況:
  如果遇到較為舊版的 client需要支援的情況,可以開啟一些SSL & TLS的支援協定:
  ssl_sslv2=NO
  ssl_sslv3=NO
  ssl_tlsv1=NO
  ssl_tlsv1_1=NO


centos7 架設 vsftpd (基本設定)

接續前一篇基礎架設後,此處說明一些基本設定:

預設安裝完畢,可以在 /etc/vsftpd 下找到 vsftpd 相關的設定檔。
其中最主要的設定檔就是 vsftpd.conf,介紹下面幾個參數:

是否允許 anonymous 帳號登入?
anonymous_enable=YES

是否允許本機帳號登入(linux 的 user)?
local_enable=NO

最大傳輸速度(上傳 與 下載必須設定相同)。單位是 Bytes,預設0表示無限制。
local_max_rate=0

最多同時連線數(包含登入連線及資料傳輸線)
max_clients=2000

每個IP最多同時連線數(包含登入連線及資料傳輸線)
max_per_ip=50

來源IP限制。可以編輯 /etc/hosts.allow 與 /etc/hosts.deny 來設定允許登入的來源IP。
tcp_wrappers=ON
其中 /etc/hosts.allow  與 /etc/hosts.deny 的寫法例如:
  vsftpd : 192.168.*.*

一般而言,如果是提供本機使用者可以透過FTP進行檔案傳輸,僅會調整下面設定:
anonymous_enable=NO
local_enable=YES
但仍然建議應該開啟 SSL 傳輸相關設定,避免帳號、密碼在傳輸過程中被盜取。
(請參考 ftps 與 pasv mode)


centos7 架設 vsftpd (預設安裝)


vsftpd是linux上較為簡易的ftp server,可以快速架設,提供簡單設定與功能。

使用預設安裝的步驟如下:

1. 使用 yum 安裝
  yum install vsftpd

2. 安裝後,將yum加入systemctl的管理,之後可以透過systemctl的開關。
  systemctl enable vsftpd

3. 啟動vsftpd 測試
  systemctl start vsftpd

  如果調整設定後要重啟,可以用:
  systemctl restart vsftpd

  關閉則用:
  systemctl stop vsftpd

4. 開啟firewall相關 port
   雖然ftpd已經啟用,但通常此時firewall 仍然阻擋外部連線,需要進一步打開firewall設定。
 
  查看firewall運作中的 zone (組態),通常是 public:
  firewall-cmd --get-default-zone

  查看 public 組態的內容:
  firewall-cmd --zone=public --list-all

  在 public 增加 ftp相關設定:
  firewall-cmd --zone=public --permanent --add-service=ftp
  firewall-cmd --reload

  PS:firewall-cmd 的參數:
    --permanent 寫入設定檔,之後啟動都會有效。
    --reload 現在重新讀取設定檔,進行調整。

5. 到這一步驟,應該可以用 anonymous 登入 ftp了。