본문 바로가기

목록이 없습니다.

[Ubuntu] SFTP 사용법

Server/Ubuntu

    FTP? SSH? SFTP?

    FTP는 File Transfer Protocol의 약자로 TCP/IP 계층을 통해서 파일을 전송하는 프로토콜입니다. 예전에는 FTP가 많이 사용되었지만 인터넷의 보급이 활발해지고 악용하는 사례도 늘어나며 해킹문제도 심각할 때 쯔음 보안이 중요해지면서 요즘에는 보안적으로 취약한 FTP는 거의 사용되지 않는 것 같습니다. 저도 FTP는 안쓰고 주로 SFTP를 사용합니다. 앞에 붙은 알파벳 'S'는 짐작하셨겠지만 Secure를 의미합니다. 이는 이전에 SSH(Secure SHell)과도 같은 개념입니다. Shell을 통해 서버를 조작하는 작업 또한 보안이 이슈가 되면서 SSH가 등장하게 되었고 요즘에는 거의 SSH로 작업합니다. (저는 사실 서버 접속 방식 중에 SSH을 제외하고는 telnet밖에 사용해보지 못했습니다..)

    FTP나 telnet 같은 경우에 보안적으로 취약하다고 했는데 다른 이유는 아니고 해당 프로토콜을 통해서 통신을 하면 전송되는 내용들이 암호화가 되어 있지 않기 때문에 비밀번호같은 중요한 데이터가 쉽게 노출될 위험이 있습니다. 앞에 알파벳 'S'가 붙으면서 SFTP나 SSH는 암호화를 한 내용들을 주고받기 때문에 비교적 보안적이라고 합니다.

     

    아무튼 오늘은 SFTP 사용법에 대해서 정리해보려고 합니다. FTP와 거의 차이가 없을것 같기도 하고 그렇게 어렵지 않은 내용이기는 해도 막상 서버작업을 오랜만에 하려고 키보드에 손을 얹었을 때 버벅이는 경우가 있기 때문에 그럴 때 찾아보기 위하여!

     


    SFTP 접속 포트 변경

    SFTP는 SSH 기반 FTP이기 때문에 우선 접속하려는 서버에 SSH가 설치되어있다는 가정 하에 진행하도록 하겠습니다. 그리고 SFTP 접속 설정 또한 SSH 설정파일에서 할 수 있습니다.

    보통 SSH나 SFTP를 사용할 때에는 설치하고 기본 포트로 사용하지만 보안을 이유로 포트를 변경해야하는 경우가 있을 수 있습니다.

     

    /etc/ssh/sshd_config

    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options override the
    # default value.
    
    #Port 22
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::
    
    #HostKey /etc/ssh/ssh_host_rsa_key
    ...
    
    # override default of no subsystems
    Subsystem sftp  /usr/lib/openssh/sftp-server
    
    # Example of overriding settings on a per-user basis
    #Match User anoncvs
    #Match LocalPort 22
    #       X11Forwarding no
    #       AllowTcpForwarding no
    #       PermitTTY no
    #       ForceCommand cvs server
    PasswordAuthentication yes

    기본 포트를 사용하고 있는 SSH의 설정 파일 내용입니다. 위에서 6번째줄에 있는 Port를 설정하는 부분이 주석처리되어있습니다. 아래에 Subsystem 설정부분은 sftp 설정 부분입니다. 이 부분 중에 Match LocalPort 라는 부분은 제가 추가한 것으로 이 설정을 통해서 SFTP 포트를 변경할 수 있습니다. 이는 위에 SSH port와 동일하게 맞춰주어야 하는걸로 알고 있습니다.

    따라서 SFTP 포트를 변경하기 위해서는 SSH 포트를 변경하고 똑같은 포트로 SFTP 포트를 변경해주면 됩니다.

     

    SFTP 접속 방법

    접속방법은 간단합니다. SSH 접속과 비슷합니다.

    $ sftp 계정이름@접속할IP(또는 도메인)

     

    SFTP 옵션

    접속 명령어의 옵션은 다음과 같습니다.

     

    -b <배치파일> 배치파일 지정  
    -o <ssh 설정 항목> ssh 설정 설정파일(sshd_config)에서 사용되고 있는 형식의 옵션을 지정합니다. 예를 들어, 다른 포트를 이용하려면 sftp -oPort=24 로 지정합니다.
    -s <subsystem> | <sftp 서버> SFTP 서버 경로 지정 원격지 상에 있는 SFTP 서버의 경로를 지정합니다. 프로토콜 버전 1로 SFTP를 사용하거나 원격지의 sshd에 sftp subsystem이 설정되어 있지 않는 경우에 편리합니다.
    -v 로그 레벨 로그 레벨을 변경합니다.
    -B <버퍼사이즈> 버퍼 사이즈 기본적으로 파일을 전송하는 프로토콜에서 버퍼 사이즈를 지정합니다. 버퍼를 크게 설정하면 주고받는 네트워크 비용이 감소하지만 메모리는 더 크게 소비합니다. (기본값 32786)
    -C 압축(Compress) 압축기능을 사용 가능하게 합니다.
    -F <ssh 설정파일 경로> ssh 설정 파일 지정 다른 ssh 설정 파일을 지정합니다.
    -P <sftp 서버 경로> sftp 서버 패스 ssh를 사용하지 않고 직접 sftp-server에 접속합니다. (클라이언트와 서버의 디버깅용)
    -R <동시 리퀘스트 수> 동시 request 수 request를 동시에 최대 어느 정도까지 행하는지를 지정합니다. 이 값을 늘리면 파일 전송 속도가 조금 빨라지지만, 메모리를 더 많이 소비합니다. (기본값 16)
    -S <프로그램 경로> 암호화 프로그램 암호화된 접속을 사용하기 위해 프로그램을 지정합니다.
    -1 프로토콜 버전 프로토콜 버전 1을 사용합니다.

     

    가장 많이 사용되는 옵션 중에 접속 포트 지정이 있습니다. 보안상의 이유로 기본 포트를 사용하지 않는 경우에는 포트를 지정해서 접속해주어야 합니다.

    예를 들어 20122 포트로 접속해야하는 경우에 접속 명령어는 다음과 같습니다.

    $ sftp -oPort=20122 test@127.0.0.1

     

    SFTP 접속 후 명령어 (대화적 명령)

    SFTP를 통해 원격 서버에 접속한 후에도 명령어를 통해서 파일 전송을 해야합니다. 이를 대화적 명령이라고 하고 실질적으로 어떤 파일을 전송할 것인지 그리고 어느 위치에 받아올 것인지 등을 선택할 수 있습니다.

     

    bye 종료 SFTP 접속을 종료합니다.
    exit
    quit
    cd <경로> 디렉토리 이동(원격지) (원격지)지정한 경로로 이동합니다.
    lcd <경로> 디렉토리 이동(로컬) (로컬)지정한 경로로 이동합니다.
    chgrp <그룹ID> <경로> 그룹 ID 변경 (원격지) 경로에 해당하는 파일의 그룹 ID를 변경합니다.
    chmod <모드> <경로> 권한 변경 (원격지) 경로에 해당하는 파일의 권한을 변경합니다.
    chown <유저ID> <경로> 소유자 변경 (원격지) 경로에 해당하는 파일의 소유자를 변경합니다.
    help 사용법 사용법을 표시합니다.
    ?
    lls [ls옵션 [경로]] 목록 (로컬) (로컬) 경로 상에 목록을 표시합니다.
    lmkdir <경로> 디렉토리 생성(로컬) (로컬) 경로 상에 디렉토리를 생성합니다.
    ln <경로A> <경로B> 링크 연결 (원격지) A파일에 B를 링크 연결합니다.
    lpwd 현재 디렉토리 (로컬) (로컬) 현재 디렉토리를 표시합니다.
    ls [경로] 목록 (원격지) (원격지) 경로 상에 목록을 표시합니다.
    lumask umask (로컬)  
    mkdir <경로> 디렉토리 생성(원격지) (원격지) 경로에 디렉토리를 생성합니다.
    pwd 현재 디렉토리 (원격지) (원격지) 현재 디렉토리를 표시합니다.
    rename <경로A> <경로B> 이름 변경 (원격지) 경로A를 경로B로 이름을 변경합니다.
    * 이동 시킬 수는 없습니다.
    rmdir <경로> 디렉토리 삭제 (원격지) 경로에 해당하는 디렉토리를 삭제합니다.
    rm <경로> 파일 삭제 (원격지) 경로에 해당하는 파일을 삭제합니다.
    symlink <경로A> <경로B> 심볼릭 링크 (원격지) 경로A와 경로B를 연결합니다.
    ! <명령> 명령어 실행 (로컬) (로컬) 명령어를 실행합니다.
    ! 로컬 쉘 접속 로컬 쉘로 접속합니다.

     

    ※ ! <명령> 명령어를 통해서 로컬 명령어를 실행하는 경우에 단발성으로 그 상태가 유지되지 않습니다. 쉽게 말해서 !cd /mnt 명령어를 통해서 디렉토리를 이동해도 결과에는 이동되었다고 나오지만 다시 !pwd 명령어를 통해서 현재 디렉토리를 확인하면 이동 전에 디렉토리가 유지되는 것을 볼 수 있습니다. 파일 삭제나 생성 같은 경우에는 단발성으로도 처리가 완벽하게 되지만, 디렉토리 이동같은 경우에는 lcd와 같은 제공되는 명령어를 통해서 하는 것이 좋습니다.

     

     

    참고

    https://nxmnpg.lemoda.net/ko/1/sftp