Клиент-серверное приложение для ведения журнала запущенных процессов

Мое первое клиент-серверное приложение. Это простой скрипт Python, который получает список запущенных процессов из Server_1 и записывает его в файл с именем datetime на Server_2каждые 5 секунд.

Я планирую преобразовать этот код в одну или две функции, возможно, одну для защиты соединения и одну для реализации логики.

Я также ничего не знаю о передовых методах обеспечения безопасности и ищу подсказки. Любые отзывы по любому аспекту кода приветствуются.


import os
import paramiko
from time import sleep
from datetime import datetime

SERVER_1 = os.getenv('HOST_1') or ""
SERVER_1_PASS = os.getenv('PASS_1') or ""
SERVER_2 = os.getenv('HOST_2') or ""
SERVER_2_PASS = os.getenv('PASS_2') or ""

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(SERVER_1, username="root", password=SERVER_1_PASS)

ssh2 = paramiko.SSHClient()
ssh2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh2.connect(SERVER_2, username="root", password=SERVER_2_PASS)

while True:

    now = datetime.now()
    dt_string = now.strftime("%d-%m-%YT%H:%M:%S")

    stdin, stdout, stderr = ssh.exec_command("ps -aux")

    processes = stdout.readlines()
    output = [line.strip() for line in processes]

    ftp = ssh2.open_sftp()
    try:
        file = ftp.file(dt_string, "a", -1)
        file.write('n'.join(output))
        file.flush()
        ftp.close()
    except IOError as e:
        print("Could not write to file")
        print(e)

    sleep(5)
```

1 ответ
1

SERVER_1_PASS = os.getenv('PASS_1') or ""
SERVER_2_PASS = os.getenv('PASS_2') or ""

Я не думаю, что передавать секреты в среду — хорошая идея — это слишком легко читается другими процессами. Вместо этого лучше хранить их в файле, доступном только пользователю. Поскольку мы используем SSH, у нас даже уже есть такой файл ($HOME/.ssh/config), хотя лучше было бы использовать аутентификацию с открытым ключом.

ssh.connect(SERVER_1, username="root", password=SERVER_1_PASS)

Ой — зачем нам подключаться как root? Для этого у нас должен быть выделенный пользователь с минимальным уровнем возможностей для выполнения задачи.

Что значит connect() делать, когда SERVER_1 это пустая строка (по умолчанию, если она не передана в среде)? Это то, чего мы хотим, или в этом случае следует сделать ошибку?

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *