понедельник, 30 августа 2021 г.

Установка и настройка ProFTPd. Настройка авторизации пользователей через базу данных PostgeSQL.

Все действия приведены применительно к Debian 10.

Предполагается, что
PostgeSQL уже установлен в системе.
Создана папка для корня FTP сервера - /ftp
Созданы подпапки для пользователей, например - /ftp/nn и /ftp/saratov с правами 777

Установка сервиса ProFTPd:
$ sudo apt install proftpd
$ sudo systemctl enable proftpd
$ sudo systemctl start proftpd

Сервер работает под пользователем proftpd
Задаем пароль для этого пользователя (например, 12345) и оболочку (/bin/bash)
$sudo passwd proftpd
Новый пароль : 12345
Повторите ввод нового пароля : 12345
$sudo chsh -s /bin/bash proftpd


Установка расширения для proftpd, работающего с СУБД PostgeSQL
$ sudo apt install proftpd-mod-pgsql

Создаем базу данных для пользователя базы proftpd и выдалим привелегии этому пользователю для базы и таблицы:
$ sudo -u postgres psql
postgres=# CREATE USER proftpd;
postgres=# ALTER ROLE proftpd CREATEDB;
postgres=# ALTER USER proftpd with encrypted password 'pass123';
postgres=# CREATE DATABASE proftpddb;
postgres=# \c proftpddb;
postgres=# CREATE TABLE users (id serial PRIMARY KEY,username varchar(20),password varchar(20),groupname varchar(24),uid int,gid int,homedir varchar(70),shell varchar(20));
postgres=# GRANT ALL privileges ON DATABASE proftpddb TO proftpd;
postgres=# GRANT ALL ON users TO proftpd;


Создаем пользователей, которые будут подключаться к FTP серверу
Например, пользователя nn с паролем xxxzzz777 и домашним каталогом /ftp/nn
postgres=# INSERT INTO users (username, password, groupname, uid, gid, homedir,shell) VALUES ('nn','xxxzzz777','ftp',1010,1010, '/ftp/nn','/bin/sh');
Пользователи не смогут выходит за пределы "своих" каталогов.

Файл конфигурации сервера ProFTPd будет тут: /etc/proftpd/proftpd.conf
Вносим в него правки
$ sudo nano /etc/proftpd/proftpd.conf
Устанавливаем корень FTP сервера - для всех пользователей - свою домашнюю директорию
За ее пределы пользователи не смогу выходить
DefaultRoot                   ~
Раскомментируем строку, отключающаяю запрос реального shell для пользователя
RequireValidShell             off
Раскомментируем строку
Include /etc/proftpd/sql.conf

В файле модулей proFFTPd (/etc/proftpd/modules.conf) подключаем модуль sql и postgres
$ sudo nano /etc/proftpd/modules.conf
Раскомментируем строку:
LoadModule mod_sql.c
и добавляем строку
LoadModule mod_sql_postgres.c

В файле модуля sql (/etc/proftpd/sql.conf) вносим настройки для доступа к базе данных с пользователями
$ sudo nano /etc/proftpd/sql.conf
<IfModule mod_sql.c>

# Определение режима работы - база PostgreSQL
SQLBackend      postgres
SQLEngine on

# Аутентификация по имени пользователя, юзера
SQLAuthenticate users
# Пароль будет передаваться в базу открытым текстом
SQLAuthTypes    Plaintext
# НазваниеБазы@Сервер Логин Пароль
SQLConnectInfo proftpddb@localhost proftpd pass123
# Имя таблицы (users) и последовательность полей таблицы users
SQLUserInfo users username password uid gid homedir shell
</IfModule>


Рестарт сервера для применения настроек:
$ sudo systemctl restart proftpd

Если потребуется отладка, то запуск proFTPd в отладочном режиме:
$ sudo /usr/sbin/proftpd -d 9 -n

понедельник, 12 июля 2021 г.

Запуск скрипта python без указания программы транслятора

Скрипт Python можно запустить из командной строки Linux, например, таким образом:
# python3 script.py 

При этом файл script.py должен находиться в директории в которой находиться пользователь. В начале команды указывается интерпретатор, который должен обработать файл с программой. Но можно сделать скрипт исполняемым (chmod +x script.py) и добавить в начало файла специальную строчку описывающую, как исполнять программу данного файла. Эта строка должна начинаться с символов #!, которые вместе называются shebang (шебанг) и содержит путь к программе интерпретатора.
Например, первая строка может быть такой: #!/usr/bin/python3.

В этом случае запуск скрипта может выполняться так:
# ./script.py

После запуска скрипта таким образом часто возникает ошибка:
-bash: ./script.py: /usr/bin/python3^M: неверный интерпретатор: Нет такого файла или каталога
Это связано с тем, что символы переноса строки были созданы в ОС, отличной от Linux. В Linux в редакторе MCEDIT они отображаются так:

В Sublime Text 3 при использовании расширения RawLineEdit символы завершения строки отображаются так:

Если стереть эти символы (по крайней мере в первой строке), то скрипт будет выполняться без ошибок.

Установка и подключение к PostgreSQL в Debian 10

По умолчанию в Debian 10 из стандартных репозитариев устанавливается 11 версия PostgreSQL
$ sudo apt install postgresql
При этом создается пользователь postgres, от имени которого будет инициироваться запуск приложения. Учетная запись postgres создается как заблокированная для аутентификации в самой ОС и поэтому пароля не имеет.
Добавление PostgreSQL в автозагрузку и запуск сервиса:
$ sudo systemctl enable postgresql
$ sudo systemctl start postgresql

Сервер баз по умолчанию слушает localhost на порту 5432.
Логи сервера будут в файле - /var/log/postgresql/

Заходим от имени postgres в командную строку сервера базы данных
$ sudo -u postgres psql
В этом режиме под пользователем postgres меняются глобальные настройки всей СУБД (создаются пользователи, базы, выполняется репликация и пр.)

Просмотр всех созданных пользователей:
postgres=# \du
Создание нового пользователя, выдача ему прав на создание базы данных, установка пароля для пользователя:
postgres=# CREATE USER korolev;
postgres=# ALTER ROLE korolev CREATEDB;
postgres=# ALTER USER korolev with encrypted password '******';

Выход из клиента psql - CTRL+D
По умолчанию все созданные локальные пользователи имеют метод аутентификации – peer, то есть выполняется аутентификация средствами ОС и при подключении к СУБД из под одноименного пользователя ОС не потребуется введение пароля.
Это регулируется в файле  - /etc/postgresql/11/main/pg_hba.conf

Из оболочки ОС под пользователем korolev создаем базу данных с именем tet
$ createdb tet
Теперь созданная база данных может быть использована пользователем korolev.
Подключение к базе выполняется так:
$ psql -d tet
psql (11.12 (Debian 11.12-0+deb10u1))
Введите "help", чтобы получить справку.
tet=>

Пользователь, создавший базу данных может делать с ней все что захочет.

К базе данных можно подключиться с использованием библиотек языков программирования, например, с помощью библиотеки psycopg2 и Python.
Установка библиотеки psycopg2 для взаимодействия с базой данных:
$ sudo apt install python3-psycopg2
$ sudo apt install libpq-dev


Теперь можно использовать скрипт на Python для выполнения команд

#!/usr/bin/python3
#-*-coding: utf-8-*-

import psycopg2
conn = psycopg2.connect(dbname='tet', user='korolev', password='******', host='localhost')
cursor = conn.cursor()

cursor.execute('SELECT * FROM ats')
for row in cursor:
    print(row)

cursor.close()
conn.close()