cloudx-proxy 0.4.4__py3-none-any.whl → 0.4.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
cloudx_proxy/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.4.4'
21
- __version_tuple__ = version_tuple = (0, 4, 4)
20
+ __version__ = version = '0.4.5'
21
+ __version_tuple__ = version_tuple = (0, 4, 5)
cloudx_proxy/setup.py CHANGED
@@ -224,15 +224,21 @@ class CloudXSetup:
224
224
  self.print_status("Invalid input", False, 2)
225
225
  return False
226
226
 
227
- # Create a title for the 1Password item
228
- ssh_key_title = f"cloudX SSH Key - {self.ssh_key}"
227
+ # Create possible title variations for the 1Password item
228
+ ssh_key_title_with_prefix = f"cloudX SSH Key - {self.ssh_key}"
229
+ ssh_key_title_without_prefix = self.ssh_key
229
230
 
230
- # Check if a key with this title already exists in 1Password
231
+ # Check if a key with either title exists in 1Password
231
232
  ssh_keys = list_ssh_keys()
232
- existing_key = next((key for key in ssh_keys if key['title'] == ssh_key_title), None)
233
+
234
+ # First check for our prefixed format, then for a plain key with the same name
235
+ existing_key = next((key for key in ssh_keys if key['title'] == ssh_key_title_with_prefix), None)
236
+ if not existing_key:
237
+ existing_key = next((key for key in ssh_keys if key['title'] == ssh_key_title_without_prefix), None)
233
238
 
234
239
  if existing_key:
235
- self.print_status(f"SSH key '{ssh_key_title}' already exists in 1Password", True, 2)
240
+ key_title = existing_key['title']
241
+ self.print_status(f"SSH key '{key_title}' already exists in 1Password", True, 2)
236
242
  # Get the public key
237
243
  result = subprocess.run(
238
244
  ['op', 'item', 'get', existing_key['id'], '--fields', 'public key'],
@@ -249,8 +255,8 @@ class CloudXSetup:
249
255
  return True
250
256
  else:
251
257
  # Create a new SSH key in 1Password
252
- self.print_status(f"Creating new SSH key '{ssh_key_title}' in 1Password...", None, 2)
253
- success, public_key, item_id = create_ssh_key(ssh_key_title, selected_vault)
258
+ self.print_status(f"Creating new SSH key '{ssh_key_title_with_prefix}' in 1Password...", None, 2)
259
+ success, public_key, item_id = create_ssh_key(ssh_key_title_with_prefix, selected_vault)
254
260
 
255
261
  if not success:
256
262
  self.print_status("Failed to create SSH key in 1Password", False, 2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cloudx-proxy
3
- Version: 0.4.4
3
+ Version: 0.4.5
4
4
  Summary: SSH proxy command to connect VSCode with Cloud9/CloudX instance using AWS Systems Manager
5
5
  Author-email: easytocloud <info@easytocloud.com>
6
6
  License: MIT License
@@ -224,6 +224,30 @@ When adding new instances to an existing environment, you can choose to:
224
224
 
225
225
  This three-tier structure offers better maintainability by reducing duplication and making it clear which settings apply broadly and which are specific to an environment or host.
226
226
 
227
+ ### Security Model: AWS and SSH Integration
228
+
229
+ cloudX-proxy implements a unique dual-layer security approach that combines AWS's robust authentication mechanisms with SSH's connection handling capabilities:
230
+
231
+ #### AWS Security Layer (Primary)
232
+ The primary security boundary is enforced through AWS Systems Manager (SSM) and EC2 Instance Connect. This layer provides:
233
+ - **Access Control**: Only authenticated AWS users with appropriate IAM permissions can establish SSM sessions
234
+ - **Dynamic Key Authorization**: EC2 Instance Connect allows temporary injection of SSH public keys, valid only for a single session
235
+ - **Network Security**: No inbound SSH ports need to be exposed, as all connections are established through AWS SSM's secure tunneling
236
+ - **Audit Trail**: All connection attempts and key pushes are logged in AWS CloudTrail
237
+
238
+ #### SSH Layer (Secondary)
239
+ SSH serves primarily as a connection handler rather than the main security mechanism:
240
+ - **Ephemeral Authentication**: The SSH key pair is used only to establish the connection through the SSM tunnel
241
+ - **Session Management**: SSH handles the actual terminal session, file transfers, and multiplexing
242
+ - **Key Flexibility**: Since keys are pushed dynamically for each session, the same key can safely be used across multiple instances
243
+ - **Zero Trust Model**: Even if a key is compromised, access still requires valid AWS credentials and permissions
244
+
245
+ This architecture means that:
246
+ 1. The security of the connection relies primarily on AWS IAM permissions and SSM session management
247
+ 2. SSH keys can be reused across instances without security implications
248
+ 3. Each connection gets a fresh key authorization through EC2 Instance Connect
249
+ 4. Instances remain completely closed to direct SSH access from the internet
250
+
227
251
  ### VSCode Configuration
228
252
 
229
253
  1. Install the "Remote - SSH" extension in VSCode
@@ -0,0 +1,12 @@
1
+ cloudx_proxy/_1password.py,sha256=uxyCfVvO1eQrOfYRojst_LN2DV4fIwxM5moaQTn3wQY,5853
2
+ cloudx_proxy/__init__.py,sha256=ZZ2O_m9OFJm18AxMSuYJt4UjSuSqyJlYRaZMoets498,61
3
+ cloudx_proxy/_version.py,sha256=YrJwLVAkXjdo87YWYyrI7_B7BOSjbDIJ_FAFmb7g_vc,511
4
+ cloudx_proxy/cli.py,sha256=5IcfYFACUOa4pqSKuHucqZionI9P8n5ZLvtzyXYeTvw,4218
5
+ cloudx_proxy/core.py,sha256=RF3bX5MQiokRKjYEPnfWdKywGdtoVUvV2xZqm9uOl1g,8135
6
+ cloudx_proxy/setup.py,sha256=TMFSo3-RusvQ5G7_I0vUPtZG18yDnogQbRDxGxVtNnM,38632
7
+ cloudx_proxy-0.4.5.dist-info/LICENSE,sha256=i7P2OR4zsJYsMWcCUDe_B9ZfGi9bU0K5I2nKfDrW_N8,1068
8
+ cloudx_proxy-0.4.5.dist-info/METADATA,sha256=heC8F4kGgkmgSy-8SdqpgsKsGZ27N3xNkZI8wR3nogw,18522
9
+ cloudx_proxy-0.4.5.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
10
+ cloudx_proxy-0.4.5.dist-info/entry_points.txt,sha256=HGt743N2lVlKd7O1qWq3C0aEHyS5PjPnxzDHh7hwtSg,54
11
+ cloudx_proxy-0.4.5.dist-info/top_level.txt,sha256=2wtEote1db21j-VvkCJFfT-dLlauuG5indjggYh3xDg,13
12
+ cloudx_proxy-0.4.5.dist-info/RECORD,,
@@ -1,12 +0,0 @@
1
- cloudx_proxy/_1password.py,sha256=uxyCfVvO1eQrOfYRojst_LN2DV4fIwxM5moaQTn3wQY,5853
2
- cloudx_proxy/__init__.py,sha256=ZZ2O_m9OFJm18AxMSuYJt4UjSuSqyJlYRaZMoets498,61
3
- cloudx_proxy/_version.py,sha256=rQpExgwkkSMYhPbtDdfhSejoe7mM9tgzyWoNno0mgIw,511
4
- cloudx_proxy/cli.py,sha256=5IcfYFACUOa4pqSKuHucqZionI9P8n5ZLvtzyXYeTvw,4218
5
- cloudx_proxy/core.py,sha256=RF3bX5MQiokRKjYEPnfWdKywGdtoVUvV2xZqm9uOl1g,8135
6
- cloudx_proxy/setup.py,sha256=11DsAVt6L4d3VmuJNpU07-QdF3FwahOUpJyLDksMeaE,38216
7
- cloudx_proxy-0.4.4.dist-info/LICENSE,sha256=i7P2OR4zsJYsMWcCUDe_B9ZfGi9bU0K5I2nKfDrW_N8,1068
8
- cloudx_proxy-0.4.4.dist-info/METADATA,sha256=22Yrnn7514Dd8eYte1c03xXpSjMhgATvwIftn1A95iQ,16757
9
- cloudx_proxy-0.4.4.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
10
- cloudx_proxy-0.4.4.dist-info/entry_points.txt,sha256=HGt743N2lVlKd7O1qWq3C0aEHyS5PjPnxzDHh7hwtSg,54
11
- cloudx_proxy-0.4.4.dist-info/top_level.txt,sha256=2wtEote1db21j-VvkCJFfT-dLlauuG5indjggYh3xDg,13
12
- cloudx_proxy-0.4.4.dist-info/RECORD,,