پرش به محتوا

کاربر فقط SFTP و محبوس در پوشه‌ی خودش

به یک همکار یا مشتری اجازه‌ی آپلود فایل بدهید، بدون این‌که به شل سرور یا پوشه‌های دیگر دسترسی داشته باشد.

Ubuntu 24.04 LTSسطح: متوسطبرای: Ubuntu 24.04 LTS، Ubuntu 26.04 LTS، Ubuntu 22.04 LTSبه‌روزرسانی: ۱۶ آبان ۱۴۰۵

سناریو: شرکت طرف قرارداد باید فایل‌های گزارش را روی سرور بگذارد. نباید بتواند دستور اجرا کند یا بقیه‌ی فایل‌سیستم را ببیند.

۱. گروه و کاربر

bash
sudo groupadd sftponly
sudo useradd -m -d /srv/sftp/partner1 -s /usr/sbin/nologin -G sftponly partner1
sudo passwd partner1

۲. مالکیت پوشه‌ها

شرط chroot در OpenSSH این است که پوشه‌ی ریشه‌ی زندان متعلق به root باشد و کسی جز root حق نوشتن در آن نداشته باشد. بنابراین یک زیرپوشه برای نوشتن می‌سازیم:

bash
sudo chown root:root /srv/sftp /srv/sftp/partner1
sudo chmod 755 /srv/sftp /srv/sftp/partner1
sudo mkdir /srv/sftp/partner1/upload
sudo chown partner1:partner1 /srv/sftp/partner1/upload

۳. پیکربندی SSH

bash
sudo nano /etc/ssh/sshd_config.d/20-sftponly.conf
ini
Match Group sftponly
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no

اگر قبلاً ورود با رمز را بسته‌اید ولی این کاربر باید با رمز وارد شود، داخل همین بلوک PasswordAuthentication yes را هم اضافه کنید. بهتر است به‌جای آن برایش کلید تعریف کنید.

bash
sudo sshd -t && sudo systemctl reload ssh

۴. آزمایش

bash
sftp partner1@192.168.10.20
sftp> pwd
sftp> put report.pdf upload/

تلاش برای SSH معمولی باید با پیام «This service allows sftp connections only» رد شود:

bash
ssh partner1@192.168.10.20
برای ثبت فعالیت‌های SFTP در لاگ، ForceCommand internal-sftp -l INFO بنویسید.