Bu örnekle, bir SSH ve SFTP kullanıcıları oluşturabilirsiniz. SFTP kullanıcıları "home" dizinleriyle sınırlıdır ve "etkileşimli olmayan kabuk kullanıcısı" olarak tanımlanırlar, yani sunucuya "normal" kullanıcı olarak giriş yapamayacakları anlamına gelir. Bu kullanıcılar sadece sftp protokolünü kullanabilirler.


Yapı


.
├── docker
│ ├── Dockerfile
│ ├── entrypoint.sh
│ ├── ssh_config
│ ├── sshd_config
│ └── user.sh
├── .env
└── docker-compose.yml

Dosyalar


.env


SSH_MASTER_USER=master
SSH_MASTER_PASS=master

docker-compose.yml


version: '3'

services:
server:
build:
context: ./docker
args:
SSH_MASTER_USER: ${SSH_MASTER_USER}
SSH_MASTER_PASS: ${SSH_MASTER_PASS}
hostname: server
ports:
- "2222:22"
volumes:
- ./uploads:/uploads

Dockerfile


FROM debian:9.5

ARG SSH_MASTER_USER
ARG SSH_MASTER_PASS

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
nano \
sudo \
openssh-server

COPY ssh_config /etc/ssh/ssh_config
COPY sshd_config /etc/ssh/sshd_config

COPY user.sh /usr/local/bin/user.sh
RUN chmod +x /usr/local/bin/user.sh
RUN /usr/local/bin/user.sh
RUN rm /usr/local/bin/user.sh

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

CMD tail -f /dev/null

user.sh


Bu dosya master isminde bir ana kullanıcı yaratıyor, ev klasörünü /home/master olarak atıyor, ssh grubuna ekliyor ve şifreyi master olarak ayarlıyor. Bununla birlikte sudo komutu yardımıyla rm, mkdir, chown, useradd, deluser ve chpasswd komutlarını kullanabilme hakkını veriyor. Bu kullanıcı yeni bir SSH kullanısı yaratabilir ve yaptıklarını geri alabilir. Grup sftp sadece SFTP kullanıcıları için kullanılacak.


#!/bin/bash
set -e

printf "\n\033[0;44m---> Creating SSH master user.\033[0m\n"

useradd -m -d /home/${SSH_MASTER_USER} -G ssh ${SSH_MASTER_USER} -s /bin/bash
echo "${SSH_MASTER_USER}:${SSH_MASTER_PASS}" | chpasswd
echo 'PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin"' >> /home/${SSH_MASTER_USER}/.profile

echo "${SSH_MASTER_USER} ALL=NOPASSWD:/bin/rm" >> /etc/sudoers
echo "${SSH_MASTER_USER} ALL=NOPASSWD:/bin/mkdir" >> /etc/sudoers
echo "${SSH_MASTER_USER} ALL=NOPASSWD:/bin/chown" >> /etc/sudoers
echo "${SSH_MASTER_USER} ALL=NOPASSWD:/usr/sbin/useradd" >> /etc/sudoers
echo "${SSH_MASTER_USER} ALL=NOPASSWD:/usr/sbin/deluser" >> /etc/sudoers
echo "${SSH_MASTER_USER} ALL=NOPASSWD:/usr/sbin/chpasswd" >> /etc/sudoers

addgroup sftp

exec "$@"

entrypoint.sh


#!/bin/bash
set -e

printf "\n\033[0;44m---> Starting the SSH server.\033[0m\n"

service ssh start
service ssh status

exec "$@"

sshd_config


ChallengeResponseAuthentication no
UsePAM no
PrintMotd no
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no

Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
ForceCommand internal-sftp

ssh_config


# Prevents "Are you sure you want to continue connecting (yes/no)?" question while connecting to the server.
# The host IP below is the client machine where the ssh command is issued from.
# Host 192.168.99.*
# StrictHostKeyChecking no
# UserKnownHostsFile=/dev/null

Host *
HashKnownHosts yes
GSSAPIAuthentication yes

Test


Containerin çalıştırılması


$ docker-compose up -d

IMAGE COMMAND PORTS NAMES
sftp_server "/usr/local/bin/entr…" 0.0.0.0:2222->22/tcp sftp_server_1

SSH kullanıcı bağlantısı


Bu kullanıcı sadece yeni SSH ve SFTP kullanıcılarını yaratmak için kullanılır.


$ ssh master@container-ip -p 22 # Password is master

Yeni SFTP kullanıcısı yaratmak


Aşağıdaki komutları çalıştırmak için öncelikle "master" kullanıcısı ile bağlanın.


$ sudo mkdir /uploads/inanzzz
$ sudo mkdir /uploads/inanzzz/upload
$ sudo useradd -d /uploads/inanzzz -G sftp inanzzz -s /usr/sbin/nologin
$ echo "inanzzz:inanzzz" | sudo chpasswd
$ sudo chown inanzzz:sftp -R /uploads/inanzzz/upload

SFTP kullanıcı bağlantısı


$ sftp inanzzz@container-ip
sftp>

Client bağlantı testi


Ben dockeri Vagrant içinde çalıştırıyorum ve IP adresi ise 192.168.99.30'dir. Vagrant içinde /etc/hosts dosyasına CONTAINER_IP localhost girdisini eklemem gerekliydi. Örnek bir FTP client (örnek: FileZilla) kullanıp, aşağıdaki bilgilerle bağlantıyı deneyin.


- Host: 192.168.99.30
- Port: 2222
- Protocol: SFTP
- Logon Type: Ask for password
- Username: inanzzz
- Password: inanzzz