mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
Generate secure tunnel install sessions
This commit is contained in:
@@ -59,6 +59,8 @@ struct StoredTunnelInstallSession {
|
||||
aether_url: String,
|
||||
management_token: String,
|
||||
node_name: String,
|
||||
tunnel_security: String,
|
||||
tunnel_encryption_key: String,
|
||||
expires_at_unix_secs: u64,
|
||||
}
|
||||
|
||||
@@ -122,6 +124,17 @@ fn generate_install_code() -> String {
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn generate_tunnel_encryption_key() -> String {
|
||||
use base64::Engine;
|
||||
|
||||
let first = uuid::Uuid::new_v4();
|
||||
let second = uuid::Uuid::new_v4();
|
||||
let mut key = [0_u8; 32];
|
||||
key[..16].copy_from_slice(first.as_bytes());
|
||||
key[16..].copy_from_slice(second.as_bytes());
|
||||
base64::engine::general_purpose::STANDARD.encode(key)
|
||||
}
|
||||
|
||||
fn unix_secs_now() -> u64 {
|
||||
chrono::Utc::now().timestamp().max(0) as u64
|
||||
}
|
||||
@@ -172,6 +185,8 @@ set -eu
|
||||
export AETHER_TUNNEL_AETHER_URL={aether_url}
|
||||
export AETHER_TUNNEL_MANAGEMENT_TOKEN={management_token}
|
||||
export AETHER_TUNNEL_NODE_NAME={node_name}
|
||||
export AETHER_TUNNEL_SECURITY={tunnel_security}
|
||||
export AETHER_TUNNEL_ENCRYPTION_KEY={tunnel_encryption_key}
|
||||
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
curl -fsSL {script_url} | sh
|
||||
@@ -185,6 +200,8 @@ fi
|
||||
aether_url = shell_single_quote(&session.aether_url),
|
||||
management_token = shell_single_quote(&session.management_token),
|
||||
node_name = shell_single_quote(&session.node_name),
|
||||
tunnel_security = shell_single_quote(&session.tunnel_security),
|
||||
tunnel_encryption_key = shell_single_quote(&session.tunnel_encryption_key),
|
||||
script_url = shell_single_quote(TUNNEL_INSTALL_UNIX_SCRIPT_URL),
|
||||
)
|
||||
}
|
||||
@@ -195,11 +212,15 @@ fn build_tunnel_powershell_script(session: &StoredTunnelInstallSession) -> Strin
|
||||
$env:AETHER_TUNNEL_AETHER_URL = {aether_url}
|
||||
$env:AETHER_TUNNEL_MANAGEMENT_TOKEN = {management_token}
|
||||
$env:AETHER_TUNNEL_NODE_NAME = {node_name}
|
||||
$env:AETHER_TUNNEL_SECURITY = {tunnel_security}
|
||||
$env:AETHER_TUNNEL_ENCRYPTION_KEY = {tunnel_encryption_key}
|
||||
irm {script_url} | iex
|
||||
"###,
|
||||
aether_url = powershell_single_quote(&session.aether_url),
|
||||
management_token = powershell_single_quote(&session.management_token),
|
||||
node_name = powershell_single_quote(&session.node_name),
|
||||
tunnel_security = powershell_single_quote(&session.tunnel_security),
|
||||
tunnel_encryption_key = powershell_single_quote(&session.tunnel_encryption_key),
|
||||
script_url = powershell_single_quote(TUNNEL_INSTALL_POWERSHELL_SCRIPT_URL),
|
||||
)
|
||||
}
|
||||
@@ -664,6 +685,8 @@ pub(crate) async fn build_proxy_node_install_session_response(
|
||||
aether_url: base_url_from_request(headers, request_context),
|
||||
management_token,
|
||||
node_name,
|
||||
tunnel_security: "non_tls_required".to_string(),
|
||||
tunnel_encryption_key: generate_tunnel_encryption_key(),
|
||||
expires_at_unix_secs,
|
||||
};
|
||||
let serialized = match serde_json::to_string(&session) {
|
||||
@@ -893,6 +916,8 @@ mod tests {
|
||||
aether_url: "https://aether.example".to_string(),
|
||||
management_token: "ae-test-token".to_string(),
|
||||
node_name: "jp-proxy-01".to_string(),
|
||||
tunnel_security: "non_tls_required".to_string(),
|
||||
tunnel_encryption_key: "base64-32-bytes".to_string(),
|
||||
expires_at_unix_secs: u64::MAX,
|
||||
}
|
||||
}
|
||||
@@ -921,6 +946,8 @@ mod tests {
|
||||
assert!(script.contains("export AETHER_TUNNEL_AETHER_URL='https://aether.example'"));
|
||||
assert!(script.contains("export AETHER_TUNNEL_MANAGEMENT_TOKEN='ae-test-token'"));
|
||||
assert!(script.contains("export AETHER_TUNNEL_NODE_NAME='jp-proxy-01'"));
|
||||
assert!(script.contains("export AETHER_TUNNEL_SECURITY='non_tls_required'"));
|
||||
assert!(script.contains("export AETHER_TUNNEL_ENCRYPTION_KEY='base64-32-bytes'"));
|
||||
assert!(script.contains(
|
||||
"https://raw.githubusercontent.com/fawney19/Aether/main/apps/aether-tunnel/install.sh"
|
||||
));
|
||||
@@ -935,6 +962,8 @@ mod tests {
|
||||
assert!(script.contains("$env:AETHER_TUNNEL_AETHER_URL = 'https://aether.example'"));
|
||||
assert!(script.contains("$env:AETHER_TUNNEL_MANAGEMENT_TOKEN = 'ae-test-token'"));
|
||||
assert!(script.contains("$env:AETHER_TUNNEL_NODE_NAME = 'jp-proxy-01'"));
|
||||
assert!(script.contains("$env:AETHER_TUNNEL_SECURITY = 'non_tls_required'"));
|
||||
assert!(script.contains("$env:AETHER_TUNNEL_ENCRYPTION_KEY = 'base64-32-bytes'"));
|
||||
assert!(script.contains(
|
||||
"https://raw.githubusercontent.com/fawney19/Aether/main/apps/aether-tunnel/install.ps1"
|
||||
));
|
||||
|
||||
Reference in New Issue
Block a user