Paramiko uses host key verification for security. MissingHostKeyPolicy
handles unknown host keys. This tutorial explains different policies and their usage.
What is Host Key Verification?
Host key verification prevents man-in-the-middle attacks. It ensures you connect to the correct server. This is a very important security feature.
Available Policies in Paramiko
Paramiko offers several MissingHostKeyPolicy
options. Each policy handles unknown keys differently. Understanding these is crucial for security.
AutoAddPolicy
AutoAddPolicy
automatically adds new host keys. This is convenient but less secure. Use it with caution in trusted environments.
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
client.connect("your_hostname", username="your_username", password="your_password")
# ... your SSH operations ...
client.close()
except Exception as e:
print(f"Error: {e}")
RejectPolicy
RejectPolicy
rejects connections with unknown host keys. This is the most secure option. It prevents connections to potentially malicious servers.
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.RejectPolicy())
try:
client.connect("your_hostname", username="your_username", password="your_password")
# ... your SSH operations ...
client.close()
except paramiko.ssh_exception.SSHException as e:
print(f"SSH Exception: {e}")
except Exception as e:
print(f"Error: {e}")
WarningPolicy
WarningPolicy
issues a warning for unknown host keys. It then adds the key and continues the connection. This is useful for initial connections.
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
try:
client.connect("your_hostname", username="your_username", password="your_password")
# ... your SSH operations ...
client.close()
except Exception as e:
print(f"Error: {e}")
Loading System Host Keys
You can load existing system host keys. This allows Paramiko to verify known servers. It is a good security practice.
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys() # Load system host keys
try:
client.connect("your_hostname", username="your_username", password="your_password")
# ... your SSH operations ...
client.close()
except paramiko.ssh_exception.SSHException as e:
print(f"SSH Exception: {e}")
except Exception as e:
print(f"Error: {e}")
Choosing the Right Policy
Choose the policy based on your security needs. RejectPolicy
is recommended for production environments. AutoAddPolicy
is suitable for testing.