ssh
檢視連線參數的設定
$ ssh -F ~/.ssh/config -G remote-host-name
user root
hostname 173.82.136.138
port 22
addressfamily any
batchmode no
canonicalizefallbacklocal yes
canonicalizehostname false
challengeresponseauthentication yes
checkhostip yes
compression no
...
建立金鑰檔
mkdir -p $HOME/.ssh
chmod 0700 $HOME/.ssh
ssh-keygen -t rsa
# Specify 4096 bits (default 2048)
# Specify the filename of the key file
# (default $HOME/.ssh/id_rsa is private key, $HOME/.ssh/id_rsa.pub is public key)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/my-vps-cloud.key -C "My Comment"
以金鑰方式連線
# By custom key file
ssh -i /path/to/the-key-file root@hostname
# By default key file ~/.ssh/id_rsa
ssh root@hostname
複製主機 A 的公鑰檔 id_rsa.pub 至遠端主機上
指令一:從主機 A 上執行
ssh-copy-id user@remote-host-ip
or
ssh-copy-id -f -i $HOME/.ssh/id_rsa.pub user@remote-host-ip
指令二:從主機 A 上執行
cat ~/.ssh/id_rsa.pub | ssh user@remote-host-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
從主機 B 上執行,以手動方式複製:
cd ~/.ssh
mv id_rsa.pub host-A-hostname.pub
cat host-A-hostname.pub >> authorized_keys
chmod 0700 ~/.ssh
chmod 0640 authorized_keys
NOTE:
如果 .ssh 目錄裡已經有 authorized_keys 檔案,可以另存一個檔名加上 2,例如 authorized_keys2
測試連線: 從主機 A 上執行
ssh <remote-userB>@<remote-hostB-name>
不需要輸入密碼就可以登入。
# Allow login from 192.168.2.0/24 subnet but not from 192.168.2.25
from="!192.168.2.25,192.168.2.*" ssh-ed25519 my_random_pub_key_here vivek@nixcraft
# Allow login from *.sweet.home but not from router.sweet.home
from="!router.sweet.home,*.sweet.home" ssh-ed25519 my_random_pub_key_here vivek@nixcraft
sshpass
整合 shell 做自動化的指令
1. ssh 執行指令
# Use the -p (this is considered the least secure choice and shouldn't be used)
sshpass -p !4u2tryhack ssh -o StrictHostKeyChecking=no username@host.example.com hostname
# Use the -f option (the password should be the first line of the filename)
echo '!4u2tryhack' >pass_file
chmod 0400 pass_file
sshpass -f pass_file ssh -o StrictHostKeyChecking=no username@host.example.com hostname
# Use the -e option (the password should be the first line of the filename)
SSHPASS='!4u2tryhack' sshpass -e ssh -o StrictHostKeyChecking=no username@host.example.com hostname
2. 整合 rsync
# Use -e
SSHPASS='!4u2tryhack' rsync --rsh="sshpass -e ssh -l username" /custom/ host.example.com:/opt/custom/
# Use -f
rsync --rsh="sshpass -f pass_file ssh -l username" /custom/ host.example.com:/opt/custom/
3. 整合 scp
scp -r /var/www/html/example.com --rsh="sshpass -f pass_file ssh -l user" host.example.com:/var/www/html
4. With a GPG-encrypted file
echo '!4u2tryhack' > .sshpasswd
gpg -c .sshpasswd
rm .sshpasswd
gpg -d -q .sshpassword.gpg > pass_file; sshpass -f pass_file ssh user@srv1.example.com hostname
整合 tar 做異機備份與檔案傳輸
NOTE:
用 tar 做檔案複製,可以保留 Symbolic links, special devices, sockets, named pipes 等等的特殊類型檔案。
Sudo: Please note that you may get an error that read as follows with ssh command when using with sudo or any other command that needs a pseudo-terminal allocation:
ssh user@box tar czf - /dir1/ > /destination/file.tar.gz
ssh user@box 'cd /dir1/ && tar -cf - file | gzip -9' >file.tar.gz
# backups /wwwdata directory to dumpserver.nixcraft.in host over ssh session
tar zcvf - /wwwdata | ssh user@dumpserver.nixcraft.in "cat > /backup/wwwdata.tar.gz"
# With gpg
tar zcf - /data2/ | gpg -e | ssh vivek@nas03 'cat - > data2-dd-mm-yyyy.tar.gz.gpg'
# With sudo
tar zcvf - /wwwdata | ssh -t vivek@192.168.1.201 "sudo cat > /backup/wwwdata.tar.gz"
# Copying from the remote machine (server1.cyberciti.biz) to local system
cd /path/local/dir/
ssh vivek@server1.cyberciti.biz 'tar zcf - /some/dir' | tar zxf -
# With dd
dd if=/dev/sdvf | ssh backupimg@vpc-aws-mumbai-backup-001 'dd of=prod-disk-hostname-sdvf-dd-mm-yyyy.img'
# To restore a local drive from the image on the server
ssh backupimg@vpc-aws-mumbai-backup-001 'dd if=prod-disk-hostname-sdvf-dd-mm-yyyy.img' | dd of=/dev/sdvf
OTP and Two-Factor Authentication
Google Authenticator
- Setting up multi-factor authentication on Linux systems
- How to Setup Two-Factor Authentication (Google Authenticator) for SSH Logins
- How To Setup Multi-Factor Authentication For SSH In Linux
- Enabling 2FA on RHEL 8 using Google Authenticator
- Configure SSH Two factor (2FA) Authentication on CentOS 8 / RHEL 8
USB Thumb Drive / Memory Card
允許可遠端登入的帳號
AllowUsers joe root@192.168.1.32 axer@163.* axer@120.109.* axer@2001:288:5400:*
# OR
AllowGroups ssh-users
踢出(Kick Out) 遠端登入帳號
root@localhost:~# who -u
abhishek pts/0 2021-04-05 09:25 00:01 31970 (223.180.180.107)
prakash pts/1 2021-04-05 09:26 . 32004 (223.180.180.107)
root pts/2 2021-04-05 09:26 . 32039 (223.180.180.107)
root@localhost:~# echo "Your session will end in 2 minutes. Save your work!" | write prakash pts/2
root@localhost:~# kill -HUP 32004
從遠端一行指令修改密碼會顯示明碼
# add the option -t to have the password to be invisible.
ssh -t <username>@<remote-host-ip> passwd
從遠端執行指令
ssh user1@server1 'df -H'
ssh root@nas01 uname -mrs
ssh root@nas01 lsb_release -a
# Run sudo or su command
ssh -t user@hostname sudo command
ssh -t user@hostname 'sudo command1 arg1 arg2'
ssh user@nas01 su -c "/path/to/command1 arg1 arg2"
# RHEL/CentOS specific #
ssh user@nas01 su --session-command="/path/to/command1 arg1 arg2"
ssh vivek@nixcraft.home.server su --session-command="/sbin/service httpd restart"
# Running and executing multiple ssh command
cat > commands.txt
date
uptime
df -H
ssh user@server_name < commands.txt
Sample: The multi-line command syntax
#!/bin/bash
_remote="ls.backup"
_user="vivek"
echo "Local system name: $HOSTNAME"
echo "Local date and time: $(date)"
echo
echo "*** Running commands on remote host named $_remote ***"
echo
ssh -T $_remote <<'EOL'
now="$(date)"
name="$HOSTNAME"
up="$(uptime)"
echo "Server name is $name"
echo "Server date and time is $now"
echo "Server uptime: $up"
echo "Bye"
EOL
安全設定
停用不安全的密碼演算法
# Find out current encryption_algorithms supported
# From local
sshd -T | grep "\(ciphers\|macs\|kexalgorithms\)"
# Frome Remote
nmap --script "ssh2*" your.ssh.server.ip
# Verify the settings
sshd -t
# Reload the SSH
systemctl reload sshd
# Test
# From Remote
ssh -vv -oCiphers=aes128-cbc,3des-cbc,blowfish-cbc <server.ip>
ssh -vv -oMACs=hmac-md5 <server.ip>
# Find out what algorithms the ssh supports for
# See the section Ciphers, KexAlgorithms, MACs
man 5 sshd_config
For RHEL 8
/etc/sysconfig/sshd
# uncomment the line with the CRYPTO_POLICY= variable in /etc/sysconfig/sshd.
CRYPTO_POLICY=
/etc/ssh/sshd_config
# Fix for 'SSH Weak Algorithms Supported'
# Fix for 'SSH Weak MAC Algorithms Enabled'
# Fix for 'SSH Weak Key Exchange Algorithms Enabled'
# For RHEL8
Ciphers aes128-ctr,aes256-ctr
KexAlgorithms curve25519-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
GSSAPIKexAlgorithms gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-
For RHEL 7
# Fix for 'SSH Weak Algorithms Supported'
# Fix for 'SSH Weak MAC Algorithms Enabled'
# Fix for 'SSH Weak Key Exchange Algorithms Enabled'
# For RHEL7
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
KexAlgorithms curve25519-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
For RHEL 6
/etc/ssh/sshd_config
# Fix for 'SSH Weak Algorithms Supported'
# Fix for 'SSH Weak MAC Algorithms Enabled'
# Fix for 'SSH Weak Key Exchange Algorithms Enabled'
# For RHEL6
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
KexAlgorithms diffie-hellman-group-exchange-sha256
MACs hmac-sha1,hmac-ripemd160
Port Knocking To Secure SSH
SFTP
How to Enable SFTP Without Shell AccessHow to Install SFTPGo on Ubuntu 22.04How to set up SFTP to chroot only for specific usersHow to configure an sftp server with restricted chroot users with ssh keys
DenyHosts
目錄權限
chmod 0700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/known_hosts
chmod 600 ~/.ssh/config
SFTP
- How to Enable SFTP Without Shell Access
- How to Install SFTPGo on Ubuntu 22.04
- How to set up SFTP to chroot only for specific users
- How to configure an sftp server with restricted chroot users with ssh keys
Learning
- How To Set up SSH Keys on a Linux / Unix System
- Top 20 OpenSSH Server Best Security Practices
- How to Set a Custom SSH Warning Banner and MOTD in Linux
- Protect SSH Logins with SSH & MOTD Banner Messages
- SSH ProxyCommand example: Going through one host to reach another server
- How To Reuse SSH Connection To Speed Up Remote Login Process Using Multiplexing
- 10 Actionable SSH Hardening Tips to Secure Your Linux Server
Web SSH