2019年11月23日 星期六

Linux sudo 設定檔 sudoers 寫法

通常要增加 sudo 使用者,可寫在 /etc/sudoers 設定檔中,
看 CentOS 7 的 /etc/sudoers 設定檔,最後會去讀取 /etc/sudoers.d/ 資料夾底下所有檔案
所以也可在 /etc/sudoers.d/ 另外新增檔案管理。

編輯設定檔,建議使用 visudo 指令,使用 visudo 指令,儲存時,會對語法格式做檢查。

直接編輯 /etc/sudoers 檔案,可不用指定檔案
$ visudo

編輯指定檔案,例如 /etc/sudoers.d/xyz
$ visudo -f /etc/sudoers.d/xyz

系統說明文件
$ man sudoers

sudo 使用者設定寫法
使用者帳號 登入者來源主機=(切換到哪個身分執行指令) 可執行的指令

範例1:
設定使用者 xyz,可用root身分執行所有指令操作
xyz ALL=(ALL) ALL

範例2:
使用 Cmnd_Alias 別名,將指令分類整理
Cmnd_Alias CMD_COMM = /bin/cd, /bin/ls, /bin/cat, /bin/less, /bin/tail, /bin/head, /bin/last, /bin/lastb
Cmnd_Alias CMD_SERVICE = /bin/systemctl
Cmnd_Alias CMD_NGINX = /bin/vi /etc/nginx/*, /bin/cp -i /etc/nginx/*, /bin/rm -i /etc/nginx/*, /bin/mv -i /etc/nginx/*, /bin/scp /etc/nginx/*
Cmnd_Alias CMD_PHP = /bin/vi /etc/php*, /bin/cp -i /etc/php*, /bin/rm -i /etc/php*, /bin/mv -i /etc/php*, /bin/scp /etc/php*
Cmnd_Alias CMD_HOME = /bin/vi /home/*, /bin/cp -i /home/*, /bin/rm -i /home/*, /bin/mv -i /home/*, /bin/scp /home/*, /bin/chown nginx\:nginx -R /home/*, /bin/chmod [0-9][0-9][0-9] /home/*

xyz ALL=(root) CMD_COMM, CMD_SERVICE, CMD_NGINX, CMD_PHP, CMD_HOME
如果指令包含「,」、「:」、「=」、「\」,這些特殊字元,須用「\」脫逸。
例如「/bin/chown nginx\:nginx -R /home/*」
除了Cmnd_Alias,其他可用的別名還有User_Alias、Runas_Alias、Host_Alias


參考:
非常Linux——sudoers文件的写法 - 让梦想从这里起飞…… - CSDN博客
sudo - Chown in sudoers file : Safe or not? - Server Fault
Sudoers Manual
如何让用户在Linux上使用sudoedit安全地编辑文件
Linux普通使用者無法使用sudo處理及sudoers設定 - IT閱讀


Linux 使用者登入 Email 通知

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

Linux 使用者登入時會讀取設定檔:
/etc/profile (login shell 才會讀)
~/.bash_profile (login shell 才會讀)
~/.bashrc (non-login shell 會讀)
CentOS 7 中 /etc/profile 會讀 /etc/profile.d/*.sh 所有檔案,
~/.bashrc 會讀 /etc/bashrc,且 /etc/bashrc 又會讀 /etc/profile.d/*.sh

所以我直接在 /etc/profile.d/ 底下新增一個 .sh 的shell script檔案,用來發信
$ vi /etc/profile.d/login.sh
if [ "${LOGNAME}" == "xyz" ] || [ "${USER}" == "xyz" ]; then
    MAIL_TO="xyz@example.com"
else
    MAIL_TO="admin@example.com,admin2@example.com"
fi

{
echo "LOGNAME=${LOGNAME}"
echo "USER=${USER}"
echo "SSH_CONNECTION=${SSH_CONNECTION}"
echo "date:" `date`
echo "who:" `who`
} | mail -S "from=ssh<ssh@example.com>" -s "LOGNAME=${LOGNAME},USER=${USER} Access from `who | cut -d'(' -f2 | cut -d')' -f1`" ${MAIL_TO}


參考:
How to Get Root and User SSH Login Email Alerts
bash - How do I set up an email alert when a ssh login is successful? - Ask Ubuntu
Linux /etc/profile檔案詳解及修改後如何立即生效(使用source命令) - IT閱讀
科学网—[转载]login shell与non-login shell的区别 - 王诗翔的博文


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 服务器进行安全文件传输