2019年11月15日 星期五

vsftpd 登入 Email 通知

安裝 mailx,使用mail指令發信
$ yum install mailx

新增 Email 通知的 sell script
$ vi /etc/vsftpd/email_script.sh
email_script.sh 內容
#!/bin/bash
[ "$PAM_TYPE" = "open_session" ] || exit 0
{
echo "User: $PAM_USER"
echo "Ruser: $PAM_RUSER"
echo "Rhost: $PAM_RHOST"
echo "Service: $PAM_SERVICE"
echo "TTY: $PAM_TTY"
echo "Date: `date`"
echo "Server: `uname -a`"
} | mail -S "from=vsftpd<vsftpd@example.com>" -s "`hostname -s` $PAM_SERVICE login: $PAM_USER" xyz@example.com
修改為可執行
$ chmod +x /etc/vsftpd/email_script.sh

使用PAM session機制,在登入時,執行發信的email_script.sh
$ vi /etc/pam.d/vsftpd
新增
session optional pam_exec.so /etc/vsftpd/email_script.sh

修改 vsftpd.conf,開啟 session_support,PAM 中 vsftpd 設定的 session 才會有效
$ vi /etc/vsftpd/vsftpd.conf
新增
session_support=YES

重新啟動vsftpd
$ systemctl restart vsftpd



登陸Linux伺服器時觸發郵件提醒 - IT閱讀
linux - Using pam_exec.so to run a script as root when a user logs in (while extracting user information)? - Unix &amp; Linux Stack Exchange
pam - How to configure vsftpd to send me an email on user login process? - Stack Overflow
FTP (Vsftp) log 設定說明 | FAQ Book

SSH 限制使用者登入的 IP

例如限制 root 只能從 192.168.0.100 的IP登入
$ vi /etc/ssh/sshd_config
新增
AllowUsers root@192.168.0.100

重新啟動 sshd
$ systemctl restart sshd.service


2019年11月7日 星期四

vsftpd 使用 SSL

先建立放SSL憑證的資料夾
$ mkdir /etc/vsftpd/ssl
產生網站的私鑰、證書。
vsftpd.key:私鑰(private key)
vsftpd.crt:證書(certificate)
(其中 -nodes 參數,表示不對 private key 加密,避免每次啟動需要輸入密碼。)
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/ssl/vsftpd.key -out /etc/vsftpd/ssl/vsftpd.crt
(再來填寫一些基本的資料,即可產生example.com.key、example.com.crt 兩個檔)
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

修改設定檔
$ vi /etc/vsftpd/vsftpd.conf
#設定密鑰檔案
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key

#啟用ssl
ssl_enable=YES

#不允許匿名者使用 SSL
allow_anon_ssl=NO

#強制將SSL用於數據傳輸
force_local_data_ssl=YES

#強制將SSL用於登錄
force_local_logins_ssl=YES

#限制連接類型為TLS
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

#如果設置為YES,則所有SSL數據連接都必須具有SSL會話重用性(表示它們控制通道的主密鑰)
require_ssl_reuse=NO
重新啟動 vsftpd
$ systemctl restart vsftpd


參考:
[Linux] vsftpd配置ssl
系统运维|如何在 CentOS 7 中使用 SSL/TLS 加固 FTP 服务器进行安全文件传输


2019年10月23日 星期三

CentOS7 NodeJS 改安裝其他版本

情況:
CentOS 使用 yum 安裝 NodeJS 12.x 的版本,但原本 NodeJS 8.x 的專案不能執行。
想改安裝 NodeJS 8.x

[NodeJS 各版本的 repo]
https://github.com/nodesource/distributions/blob/master/README.md#rpminstall

[yum 移除 NodeJS 12.x 的 repo]
查詢安裝的 nodesource 的 repo RPM 套件
# rpm -qa | grep -i nodesource
nodesource-release-el7-1.noarch

如果 RPM 套件有找到,可直接用以下指令移除
# rpm -e nodesource-release-el7-1.noarch

# yum remove nodesource-release-el7-1.noarch

如果 RPM 套件沒有找到,到 /etc/yum.repos.d/ 將 nodesource repo 設定檔移除
# mv /etc/yum.repos.d/nodesource-el7.repo /etc/yum.repos.d/nodesource-el7.repo.bak

此時查看目前的 repo 列表,應該看不到 nodesource 了
# yum repolist all

改安裝 NodeJS 8.x 的 repo
# curl -sL https://rpm.nodesource.com/setup_8.x | bash -

[清除 yum 快取]
此處最重要,要清除 yum 快取,不然安裝 NodeJS 時,還是會安裝 NodeJS 12.x,然後安裝失敗
# yum clean all

[重新安裝]
清除完快取,就可正常安裝
# yum install nodejs

YUM Remove Repo
系统安装-007 CentOS7yum源添加、删除及其yum优化

2019年8月8日 星期四

switch 中的 continue (C、PHP)

[在 switch 中使用 continue]
C:
在 C 的 switch 中使用 continue,若不是在迴圈中,出現錯誤
#include 
#include 

int main(int argc, char** argv) {
    int c = 10;
    switch (c) {
        case 7:
            continue;//error:continue statement not within a loop
    }
    return (EXIT_SUCCESS);
}

PHP:
在 PHP 的 switch 中使用 continue,沒傳遞參數時,跟使用 break 意思一樣
 「In PHP the switch statement is considered a looping structure for the purposes of continue. continue behaves like break (when no arguments are passed). If a switch is inside a loop, continue 2 will continue with the next iteration of the outer loop.
參考:https://www.php.net/manual/en/control-structures.continue.php
$c=7;
switch ($c) {
  case 7:
      var_dump("continue test");
    continue;
  default:
      var_dump($c);
    break;
}
//輸出 string(13) "continue test"




[在迴圈中的 switch 中使用 continue]
C:
在 C ,迴圈(例如while)中的 switch 使用 continue,效用會針對迴圈(例如while)
#include 
#include 

int main(int argc, char** argv) {
    int c = 10;
    while (c > 6) {
        c--;
        switch (c) {
            case 7:
                continue;
        }
        printf("%d\n", c);

    }
    return (EXIT_SUCCESS);
}
/*
輸出
9
8
6
*/

PHP:(情況一)
在 PHP,迴圈(例如while)中的 switch 使用 continue,沒傳遞參數時,跟使用 break 意思一樣
$c=10;
while ($c>6) {
   $c--;
   switch ($c) {
      case 7:
        var_dump("continue test");
        continue;
   }
   var_dump($c);
}
/*
輸出
int(9)
int(8)
string(13) "continue test"
int(7)
int(6)
*/
註:在 PHP 7.3 以上,迴圈內的 switch 使用「continue」、「continue 1」,會出現
Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?
,因為「continue」、「continue 1」其實就等於「break」,開發者寫「continue」不寫「break」,很可能是為了作用到外層的迴圈,所以出現此Warning,提醒開發者。

PHP:(情況2)
在 PHP,迴圈(例如while)中的 switch 使用 continue,若要對外層的迴圈作用,須使用「continue 數字」。
例如「continue 2」,
第1次continue作用在內層的switch,
第2次continue作用在外層的迴圈(例如while)。
$c=10;
while ($c>6) {
   $c--;
   switch ($c) {
      case 7:
        var_dump("continue test");
        continue 2;
   }
   var_dump($c);
}
/*
輸出
int(9)
int(8)
string(13) "continue test"
int(6)
*/