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了。


2018年12月24日 星期一

CentOS7.5 MySQL5.7 repliaction 架設

在MySQL資料庫的實用上,常常會需要考慮到備援或增加讀取流量,
其中簡易的處理方案就以replication或cluster。
以下為測試CentOS7.5環境下,建立兩台機器進行安裝MySQL5.7,
並設定某個DB replication的過程。

安裝MySQL
本次假定在兩台機器安裝,
MASTER位於192.168.0.201
SLAVE位於192.168.0.202
CentOS7.5預設的MySQL版本並非5.7,因此需要先從MySQL網站下載。
先下載最新的 noarch.rpm
wget http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
yum安裝搜尋路徑
yum localinstall mysql80-community-release-el7-1.noarch.rpm
查看目前yum關於MySQL的設定
yum repolist all | grep mysql
啟用MySQL5.7並關閉MySQL8.0(預設安裝最新版本)
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
設定完畢後開始安裝MySQL server
yum install mysql-community-server
啟動MySQL
systemctl start mysqld.service
PS:因為本次測試要兩台機器,所以安裝完畢後直接複製VM。
但每次安裝完畢,啟動MySQL後,MySQL會產生UUID提供辨識,
紀錄在 /var/lib/mysql/auto.cnf,
複製VM的方式會使兩個MySQL擁有相同的UUID,造成衝突。
因此複製完畢後,在其中一台VM要進行調整,將auto.cnf更名,
重新啟動MySQL,讓他重新產生UUID檔案。
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak

fireall設定調整
CentOS7已經改用firewall取代iptables。
使用firewall可以增設一組設定,不用重新啟動firewall就可以更新狀態,
避免切斷已經在進行中的連線。
以下假定要增加一組名為 trusted 的設定,開放讓192.168.0.202機器連接本機的MySQL:
firewall-cmd --permanent --zone=trusted --add-source=192.168.0.202
firewall-cmd --permanent --zone=trusted --add-port=3306/tcp
firewall-cmd  --reload
其中 --permanent 表示寫入設定檔,下次開機也會有效。
設定完畢後可以查看目前的狀態:
firewall-cmd --zone=trusted --list-all
firewall-cmd --zone=trusted --list-all --permanent

MASTER設定
MASTER的MySQL上要建立一個帳號讓SLAVE可以讀取資料變動,
需要的權限包含 FILE、REPLICATION:
GRANT FILE ON *.* TO ‘backup’@'192.168.0.202' IDENTIFIED BY ‘1234’;
GRANT REPLICATION SLAVE ON *.* TO ‘backup’@'192.168.0.202' IDENTIFIED BY ‘1234’;
建立要同步的DB
create database testdb;
打開binary log的輸出,讓SLAVE可以讀取。
編輯 /etc/my.cnf,加入下面的設定
server-id=1
log-bin
binlog-do-db=testdb
重新啟動MySQL server
PS:若有多個DB要同步,每個要獨立寫一行binlog-do-db。
完成後,若要查看MASTER的狀態,
可在MySQL下使用show master status\G,可以查看目前master設定是否運作正確。

SLAVE設定
同樣先建立要同步的testdb,
然後調整設定檔,設定要同步的db。
編輯/etc/my.cnf,加入以下設定
server-id=2
replicate-do-db=testdb
重新啟動MySQL server
PS:同樣,多個DB要分寫多行replicate-do-db。
接著設定往MASTER連線,以root登入MySQL,下達下面的命令
change master to master_host='192.168.0.201',
  master_user='backup', master_password='1234';
start slave io_thread;
start slave;
完成後查看SLAVE的狀態,使用 show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
上面兩個項目要確認為Yes才是成功運作,
如果其中有一項為No,都表示有問題。
可以直接查看MySQL的log檔,較容易找出問題所在。
MySQL的log位於:/var/log/mysqld.log

2018年11月28日 星期三

MySQL 使用格狀分割index加速2D座標半徑搜尋


2D座標的半徑搜尋,常用於尋找附近區域內的地點。這類兩個維度範圍搜尋,對於關聯式資料庫而言,一直都是個瓶頸。index僅能提供一個維度的範圍搜尋,第二個維度就無效果了。為了解決搜尋速度的問題,目前最常見的方式就是將資料用網格分割,在半徑跨越的網格內搜尋的目標,加快速度。以下使用兩個大小不同的網格來測試搜尋的速度。

2018年11月27日 星期二

檢查process並執行程式 (windows排程)

在windows環境下,有時候我們會希望使用排程定時檢查某些程式是否在運作,如果沒有運作,則執行啟動。
以下以Notepad++為例,示範如何檢查是否運作,使用排程自動執行。