Встречающиеся проблемы:
Отсутствие подключения. Несмотря на то, что сервер настроен на прием подключений через порт 2222, попыток подключения со стороны клиента обнаружено не было. Это указывает на возможные ошибки конфигурации на клиенте или проблемы, связанные с настройкой локальной сети.
Ошибки аутентификации GSSAPI: повторяющиеся ошибки «Не удалось завершить шаг GSSAPI: 0» указывают на трудности в процессе аутентификации GSSAPI. , что указывает на потенциальные проблемы с конфигурацией Kerberos или ошибки в настройках безопасности между клиентом и сервером.
Конфигурация и настройка Kerberos. Мы обнаружили, что конфигурации Kerberos могли быть настроены неправильно. Трудности с использованием kinit и отсутствие соответствующих клавишных вкладок для участников указывают на проблемы с настройкой области и управлением субъектами Kerberos.
Принятые действия:
Проверка и Настройка журналов Kerberos: мы настроили файл krb5.conf для регистрации подробных операций, что позволяет нам лучше отслеживать действия и выявлять ошибки во время аутентификации.
Базовое тестирование подключения и аутентификации: базовые тесты с использованием ping , telnet и nc проводились для подтверждения возможности подключения к серверу по указанному порту напрямую с той же машины. Это было крайне важно для того, чтобы убедиться, что проблема не связана с локальной сетью.
Анализ и отладка кода. Мы проверили код как для клиента, так и для сервера, чтобы убедиться, что конечные точки подключения и аутентификация параметры были правильными и соответствовали конфигурациям Kerberos.
ssh_server.py
Код: Выделить всё
import socket
import kerberos
import logging
import subprocess
def authenticate_user():
service = "host/localhost@LOCALHOST"
rc, context = kerberos.authGSSServerInit(service)
if rc != kerberos.AUTH_GSS_COMPLETE:
raise Exception("Failed to initialize GSSAPI context")
try:
rc = kerberos.authGSSServerStep(context, "")
if rc != kerberos.AUTH_GSS_COMPLETE:
raise Exception("Failed to complete GSSAPI step")
rc, user = kerberos.authGSSServerUserName(context)
if rc != kerberos.AUTH_GSS_COMPLETE:
raise Exception("Failed to retrieve user name")
return user
finally:
kerberos.authGSSServerClean(context)
def handle_client(client_socket):
try:
user = authenticate_user()
if user == "root":
client_socket.send(b"Benvenuto root! Hai pieno accesso al sistema.\n")
shell = "/bin/bash"
elif user in ["samu", "angelo"]:
client_socket.send(b"Benvenuto! Hai accesso limitato al sistema.\n")
shell = "/bin/rbash"
else:
client_socket.send(b"Autenticazione fallita\n")
client_socket.close()
return
process = subprocess.Popen(shell, stdin=client_socket.fileno(), stdout=client_socket.fileno(), stderr=client_socket.fileno(), shell=True)
process.wait()
except Exception as e:
logging.error(f"Errore di autenticazione: {e}")
client_socket.send(f"Errore di autenticazione: {e}\n".encode())
finally:
client_socket.close()
def main():
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 2222))
server.listen(5)
logging.info("Server in ascolto sulla porta 2222")
while True:
client_socket, addr = server.accept()
logging.info(f"Connessione accettata da {addr}")
handle_client(client_socket)
if __name__ == "__main__":
main()
Код: Выделить всё
import kerberos
import socket
import logging
import subprocess
def authenticate_user():
service = "host/localhost@LOCALHOST"
rc, context = kerberos.authGSSClientInit(service)
if rc != kerberos.AUTH_GSS_COMPLETE:
raise Exception(f"Failed to initialize GSSAPI context: {rc}")
try:
rc = kerberos.authGSSClientStep(context, "")
if rc != kerberos.AUTH_GSS_COMPLETE:
raise Exception(f"Failed to complete GSSAPI step: {rc}")
rc, user = kerberos.authGSSClientUserName(context)
if rc != kerberos.AUTH_GSS_COMPLETE:
raise Exception(f"Failed to retrieve user name: {rc}")
return user
finally:
kerberos.authGSSClientClean(context)
def main():
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
try:
user = authenticate_user()
logging.info(f"Authenticated as {user}")
server_address = ('localhost', 2222)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_address)
logging.info(f"Connected to {server_address}")
try:
if user == "root":
sock.sendall(b"Benvenuto root! Hai pieno accesso al sistema.\n")
elif user in ["samu", "angelo"]:
sock.sendall(b"Benvenuto! Hai accesso limitato al sistema.\n")
else:
sock.sendall(b"Autenticazione fallita\n")
logging.error("Authentication failed")
sock.close()
return
while True:
data = sock.recv(1024)
if not data:
break
print(data.decode('utf-8'), end='')
finally:
logging.info("Closing the connection")
sock.close()
except Exception as e:
logging.error(f"Errore di autenticazione: {e}")
print(f"Errore di autenticazione: {e}")
if __name__ == "__main__":
main()
Код: Выделить всё
[kdcdefaults]
kdc_ports = 750,88
[realms]
LOCALHOST = {
database_name = /var/lib/krb5kdc/principal
admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
acl_file = /etc/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
key_stash_file = /etc/krb5kdc/stash
kdc_ports = 750,88
max_life = 24h 0m 0s
max_renewable_life = 7d 0h 0m 0s
}
Код: Выделить всё
[libdefaults]
default_realm = LOCALHOST
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = true
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac des3-cbc-sha1
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac des3-cbc-sha1
permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac des3-cbc-sha1
[realms]
LOCALHOST = {
kdc = localhost
admin_server = localhost
}
[domain_realm]
.localhost = LOCALHOST
localhost = LOCALHOST
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
Код: Выделить всё
python3 ssh_client.py
2024-07-14 20:29:50,998 - DEBUG - Initializing GSSAPI context
2024-07-14 20:29:50,998 - DEBUG - Starting GSSAPI client step
2024-07-14 20:29:50,999 - DEBUG - GSSAPI client step result: 0
2024-07-14 20:29:50,999 - ERROR - Errore di autenticazione: Failed to complete GSSAPI step: 0
Errore di autenticazione: Failed to complete GSSAPI step: 0
Все написал выше, надеюсь понятно из описания
Подробнее здесь: https://stackoverflow.com/questions/787 ... h-kerberos