Содержание
Недавно передо мной предстала задача организовать доступ к файлам сервера. Точнее доступ был, но по каким-то причинам FTP сервер перестал работать. Разбираться в причинах было лень, и тем более, давно хотелось заменить протокол FTP чем нибудь по надёжнее. Вам, Уважаемое хабрасообщество, да будет известно, что FTP передаёт данные в не шифрованном виде. И нам, параноикам мира сего, немного сцыкотно страшно за сервер наш и данные на нём хранящиеся. По этому решил полностью отказаться от FTP в пользу SFTP. Я использую Ubuntu Server, и по умолчанию установленный в нём OpenSSH, также мне известно, что он поддерживает SFTP из коробки, поэтому задача казалась мне крайне простой и я быстро приступил к воплощению её в жизнь. С той же скоростью, с которой выполнялась задача, я столкнулся с досадным фактом того, что OpenSSH по умолчанию даёт пользователю доступ ко всей файловой системе, то есть к / — корню. Данный факт меня, и я думаю Вас, устраивать не будет. То есть с одной стороны, вроде бы ничего страшного, ведь есть права доступа которые не дадут ему, пользователю, просто так писать где ни попади. Но в целях безопасности и этого пряника у него быть не должно. Тут я подробно расскажу как тюнинговать OpenSSH сервер в Ubuntu Linux для того что бы chroot-нуть пользователя в необходимом нам каталоге. Почему я говорю тюниговать? — Да просто по тому, что, как я уже сказал, для работы SFTP достаточно всего лишь выполнить:sudo aptitude install openssh-server
Что приведёт к установке и запуску сервера, а также откроет, по умолчанию, 22 порт. Осуществив соединение на который, при помощи, например Filezilla, можно получить доступ к файловой системе удалённого компьютера/сервера по ШИФРОВАННОМУ протоколу. Но как я уже намекнул, настройки «по умолчанию» нас не устраивают. Поэтому открываем файл настройки OpenSSH сервера sudo mcedit1 /etc/ssh/sshd_config
и кое-что там изменяем/добавляем. Находим опцию Subsystem
и придаём ей следующий вид:Subsystem sftp internal-sftp
Плюс добавляем следующие опции:Match User test ChrootDirectory %h ForceCommand internal-sftp
Теперь перезапускаем OpenSSH sudo service ssh restart
и вроде бы готово. Game Over? — NO! Как Вы наверное уже догадались, право входа в систему по протоколу SFTP будут иметь пользователи которые имеют системные2 учётные записи. Поэтому необходимо создать учётную запись, под которой будут осуществляться манипуляции с файлами. Поскольку выше было написано Match User test
создавать необходимо учётную запись пользователя test.adduser test
Создается пользователь, задаётся пароль, домашний каталог по умолчанию — /home/test
…
Теперь можно попробовать соединиться с сервером, и передать файлы. Предварительно заходим в логи, что бы наблюдать за процессом…tail -f /var/log/auth.log timestamp host sshd[2558]: Accepted password for test from IP_адрес port 59667 ssh2 timestamp host sshd[2558]: pam_unix(sshd:session): session opened for user test by (uid=0) timestamp host sshd[2596]: fatal: bad ownership or modes for chroot directory "/home/test" timestamp host sshd[2558]: pam_unix(sshd:session): session closed for user test
Как видите, в логах написано: — сессия открыта для пользователя test используя UID=0, то есть идентификатор пользователя root — неправильные права собственности для того, что бы chroot-нуться в /home/test
Всё дело в том, что для каталога /home/test
необходимо назначить владельцем пользователя root, что мы и делаем:sudo chown root /home/test
Подключается и наблюдаем в логах:timestamp host sshd[2630]: Accepted password for test from IP_адрес port 50152 ssh2 timestamp host sshd[2630]: pam_unix(sshd:session): session opened for user test by (uid=0) timestamp host sshd[2669]: subsystem request for sftp
Mission complete
Подробности
В настройках OpenSSH мы описывали опцию Match User test, что само собой означает доступ отдельного, конкретного пользователя! — А если таковых много? Описание каждого пользователя — как минимум не кошерно… Короче, я хочу рассказать про то, что можно задействовать группы пользователей используя Match Group. И тогда конфиг может выглядеть приблизительно так:Match Group sites ChrootDirectory /srv/www%h ForceCommand internal-sftp
А учётные записи пользователей в /etc/passwd
так: site1:x:5000:10003::/example.com/:/bin/false site2:x:5001:1000::/example.org/:/bin/false site3:x:5002:1000::/example.net/:/bin/false
Как видно из примера, у пользователей относительный домашний каталог, то есть в корне / нет каталогов /example.com/
и т.д. Эти каталоги есть в /srv/www/
и OpenSSH должен отработать следующим образом: — Домашний каталог пользователя, из /etc/passwd
добавить к /srv/www
и в итоге получить /srv/www/example.com
и т.д. Не забываем, что владельцем каталога в который будут chroot-иться пользователи должен быть root. Группой владельцев, необходимо поставить sites и разрешить полный доступ. Также рекомендуется в качестве shell-а пользователя ставить /bin/false, что бы предотвратить доступ пользователя к командной строке.
Пояснения: 1 - mcedit - Мой любимый текстовый редактор. 2 - системные учётные записи - читать как: Созданные в системе пользователи. 3 - 1000 - всего лишь пример идентификатора группы sites.
Mission Complete & Game Over
У меня есть веб сервер без возможности удаленного доступа к нему из вне, обслуживает несколько сайтов. Он стоит за фаерволом, проброшен 80-й порт, для работы сайтов этого достаточно. Понадобилось предоставить оперативный доступ сторонних разработчиков к исходным текстам одного из сайтов. У меня неожиданно возникли затруднения с этим, пришлось повозиться.
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Администратор Linux» в OTUS. Курс не для новичков, для поступления нужно пройти .
Введение
Суть проблемы в следующем. Изначально сервер создавался для внутренней работы над всеми сайтами из локальной сети. Разграничения по правам доступа не было, работали с сайтами мало, изредка что-то правили. Со временем разработчиков вообще не осталось, сайты не менялись. Все управление шло через панели администрирования сайтами.
В один прекрасный день решили обновить один из сайтов. Попросили предоставить доступ к исходникам. В принципе, ничего сложного, думал за 5-10 минут все сделаю. Пошел по простому пути. Решил настроить ftp сервер, благо совсем недавно написал обширную статью на эту тему.
Очень быстро его настроил, проверил изнутри — все отлично работает. Создал системного пользователя, зачрутил его в каталог с нужным виртуальным хостом, расставил права как надо. Дальше дело за малым. Надо пробросить порт на шлюзе для доступа к серверу.
Тут началось самое интересное. Я давно не работал с ftp и подзабыл как там с ним и что. А проблем с ним навалом. Простого проброса 21-го порта недостаточно. Я не смог подключиться извне ни в активном, ни в пассивном режиме. На сервере установлен firewall pf, я с ним не очень знаком, почти не работал. Стал читать, как организуют проброс ftp на нем. Оказалось, что необходимо поднять локальный FTP proxy, редиректить на него все подключения и он динамически будет создавать правила для корректной работы ftp.
Мне очень не понравились перспектива ковырять незнакомый фаервол с кучей правил. К тому же нельзя было допустить ошибку и нарушить работу шлюза. Но делать нечего, решил попробовать. Информации в интернете не очень много на эту тему. По тем примерам, что мне попались не смог корректно настроить. То в синтаксисе ошибка, то просто не работает.
Решил не терять время на ковыряния не нужного для меня фаервола и пойти другим путем. Естественно, подумал сразу на sftp. Там нет таких проблем с пробросом портов. Единственное, чего я не делал раньше, так это ограничение доступа по sftp в пределах какого-то каталога. Но как оказалось это не сложно, задача легко и быстро решается.
Добавляем пользователя ssh в chroot директорию
Для начала создадим нового системного пользователя без шелла. Вообще, это не обязательно делать, можно настроить в ssh подключение не системных пользователей. Но я не вижу проблемы с системным пользователем. В моем случае для одного пользователя нет смысла заморачиваться с какими-то дополнительными настройками. Добавляем пользователя:
# useradd -s /sbin/nologin sftpuser
Дальше редактируем конфиг ssh. Открываем /etc/ssh/sshd_config. Комментируем существующую строку и добавляем следом за ней еще несколько:
# mcedit /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp Match User sftpuser ChrootDirectory /var/www/site.ru ForceCommand internal-sftp
Сохраняем и перезапускаем ssh. В случае с centos 6 команда такая:
# service sshd restart
Настройка подключения sftp с ограничением доступа за пределами конкретной папки закончена.
Ошибка ssh bad ownership or modes for chroot directory
Можно пробовать подключаться через sftp клиент. Я в данном случае предпочитаю пользоваться бесплатным WinSCP. Скорее всего вы не подключитесь и получите ошибку в лог файле /var/log/secure:
Apr 11 14:53:20 web sshd[5026]: Accepted password for sftpuser from 75.37.234.139 port 40923 ssh2 Apr 11 14:53:20 web sshd[5026]: pam_unix(sshd:session): session opened for user sftpuser by (uid=0) Apr 11 14:53:20 web sshd[5028]: fatal: bad ownership or modes for chroot directory "/var/www/site.ru" Apr 11 14:53:20 web sshd[5026]: pam_unix(sshd:session): session closed for user sftpuser
Ошибка возникает, если владелец необходимой папки не root и права доступа на запись есть у кого-то еще, кроме владельца. Такой вот нюанс. В этом есть некоторое неудобство, но в данном случае лично мне это не помешало. Делаем владельцем каталога /var/www/site.ru рута, у остальных убираем права на запись в него. Дальше в этом каталоге две папки — одна с логами веб сервера для виртуального хоста, другая с исходниками сайта. На эти папки может быть любой владелец и права доступа. Так что подключившийся пользователь сможет без проблем работать с исходниками сайта.
Заключение
На смену ftp приходит sftp. Я давно пользуюсь этим для доступа к отдельным файлам на сервере. Но есть большой минус — скорость по sftp низкая. Когда приходится качать что-то объемное, начинаешь грустить. Это нужно учитывать. Для работы с исходниками сайтов существующей скорости вполне достаточно. Для передачи объемных файлов нужно искать другие варианты подключения, тот же ftp, либо через vpn cifs или nfs.
Еще плюс такого решения — можно настроить авторизацию по сертификату. Получается удобно и безопасно. Легко подключиться по 22-м порту, плюс пароли не нужны, авторизуешься автоматически сертификатом. Настроить это не сложно, в интернете масса инструкций на тему авторизации по ssh с помощью сертификатов.
Онлайн курс по Linux
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Администратор Linux» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Что даст вам этот курс:
- Знание архитектуры Linux.
- Освоение современных методов и инструментов анализа и обработки данных.
- Умение подбирать конфигурацию под необходимые задачи, управлять процессами и обеспечивать безопасность системы.
- Владение основными рабочими инструментами системного администратора.
- Понимание особенностей развертывания, настройки и обслуживания сетей, построенных на базе Linux.
- Способность быстро решать возникающие проблемы и обеспечивать стабильную и бесперебойную работу системы.
Проверьте себя на вступительном тесте и смотрите подробнее программу по .
Помогла статья? Есть возможность отблагодарить автора
В статье я покажу, как настроить настроить SFTP-сервер в Windows с помощью OpenSSH.
Беспроводная передача данных в локальной сети — это не ноу-хау. Уже многие таким образом обмениваются файлами во внутренней сети. Часто для этого используется подключение по протоколу FTP.
Настраивается FTP-сервер и с помощью FTP-клиента другие компьютеры сети могут к нему подключиться. Но поскольку протокол FTP небезопасен, вам следует подумать об отказе от него в пользу чего-то лучшего. Для тех, кто не вкурсе, существует более безопасный протокол передачи файлов, который называется SFTP. Он шифрует передаваемые данные. Использование безопасного протокола SFTP может гарантировать, что никто не сможет подключиться и перехватить данные.
Содержание
SFTP-сервер в Windows
Все хорошо, но есть одна проблема чтобы настроить SFTP-сервер нужен SSH, а его во всех версиях Windows — нет. Если вам нужен SFTP-сервер придется использовать OpenSSH.
OpenSSH — это реализация SSH с открытым исходным кодом, и рекомендует использовать сам Microsoft. OpenSSH по умолчанию включен в Windows 10 и Windows Server 2019. Но вы можете использовать рассмотренный в статье метод с любой версией Windows.
Настройка SFTP-сервера в Windows с помощью OpenSSH
Настройка SFTP-сервер в Windows состоит из двух частей:
- Установка OpenSSH
- Открытие порта SSH для работы SFTP
Установка OpenSSH (и активация необходимых сервисов)
- Загрузите OpenSSH с .
- Распакуйте архив в папку Program Files.
- Откройте PowerShell от имени администратора и вставьте следующую команду в окно, чтобы перейти к папке:
cd "C:Program FilesOpenSSH-Win64
«. - Для работы SSH требуются две службы: sshd и ssh-agent. Чтобы установить их, введите следующую команду в окно PowerShell:
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
. Вы должны увидеть сообщение «Службы sshd и ssh-agent успешно установлены». - Закройте окно PowerShell.
- Вы можете запустить службы вручную или настроить их автоматическое открытие с помощью Services.msc. Это создаст папку
C:ProgramDatassh
с вашим ключом хоста, который имеет важное значение для работы службы.
Примечание. Службы называются агентом проверки подлинности OpenSSH и сервером SSH OpenSSH.
Открытие порта SSH в брандмауэре Windows
- SSH использует порт 22 для передачи / аутентификации, который закрыт в Windows, потому что SSH не включен по умолчанию. Чтобы открыть его, откройте брандмауэр Windows из панели управления.
- Нажмите на Входящие правила (на левой панели).
- На правой панели нажмите новое правило, выберите Порт и нажмите Далее.
- Введите число 22 в поле «Определенные локальные порты» и нажмите «Далее».
- Выберите «Разрешить подключение», нажмите «Далее» и выберите «Частный» для опции сети.
- Дайте правилу имя. Например, SSH или OpenSSH.
- Нажмите на Готово.
Тестирование SFTP-сервера
Давайте проверим, работает ли SFTP-сервер. Для этого вам нужен SFTP-клиент. Я буду испоьзовать бесплатный SFTP-клиент WinSCP, но вы можете использовать любой другой, поддерживающий SFTP, например, FileZilla, FTP Rush или файловый менеджер с поддержкой SFTP, такой как Altap Salamander.
Для Android есть много вариантов; Total Commander и Ghost Commander имеют плагины SFTP, в то время как некоторые приложения, такие как Amaze File Manager или X-plore File Manager, имеют встроенную функцию SFTP.
Тестирование SFTP-сервера в Windows
Запустите WinSCP и выберите «SFTP» в качестве протокола. В поле имени хоста введите «localhost» (если вы тестируете компьютер, на котором вы установили OpenSSH). Вам нужно будет ввести имя пользователя и пароль Windows, чтобы программа могла подключаться к серверу. Нажмите сохранить и выберите логин.
Вы увидите всплывающее окно, подобное показанному ниже, которое спрашивает вас, доверяете ли вы серверу, к которому пытаетесь подключиться. Поскольку сервер является вашим собственным компьютером, вы можете разрешить это. В основном это ключ хоста, который аутентифицирует соединение, установленное устройством. Вы можете использовать это для передачи контента с одного компьютера на другой тоже.
Примечание. Если ваша учетная запись пользователя Windows не имеет пароля, вам потребуется использовать открытый ключ для аутентификации SFTP-сервера, который включает отдельный процесс. Вы можете создать другую учетную запись в системе для доступа к SFTP, но, возможно, потребуется сделать файлы доступными вне пользовательского каталога.
Тестирование SFTP-сервера в Android
Давайте использовать Amaze File Manager с открытым исходным кодом. Нажмите кнопку + и выберите «Облачное соединение». Выберите соединение SCP / SFTP, и должно появиться всплывающее окно. Найдите IP-адрес вашего компьютера с помощью командной строки и команды IP-конфигурации. Например, мой компьютер имеет адрес 192.168.1.9
Введите его в поле сервера, оставьте номер порта как 22 и введите имя пользователя и пароль Windows в соответствующих полях. Он должен подключиться к вашему компьютеру, и вы сможете получить доступ ко всему содержимому, доступ к которому может получить учетная запись Windows.
Заключение
Одним из основных преимуществ SFTP-сервера является то, что вы сможете легко получать доступ или передавать файлы по сети. Это не единственный способ делиться файлами, есть также небезопасный SMB и т.д., о которых мы рассказывали в этой статье.
Используемые источники:
- https://habr.com/post/89473/
- https://serveradmin.ru/dostup-k-saytu-po-sftp-vmesto-obyichnogo-ftp/
- https://tech-geek.ru/setup-sftp-server-windows/