--- # AWS Redirector-only Deployment Playbook - name: Deploy AWS redirector hosts: localhost gather_facts: false connection: local vars_files: - vars.yaml vars: # Default values for required variables ssh_user: "{{ ssh_user | default('kali') }}" aws_region: "{{ aws_region | default(aws_region_choices | random) }}" instance_type: "{{ aws_instance_type | default('t2.micro') }}" # Generate random instance name if not provided redirector_name: "{{ redirector_name | default('srv-' + 9999999999 | random | to_uuid | hash('md5') | truncate(8, True, '')) }}" # Generate random shell handler port if not provided shell_handler_port: "{{ shell_handler_port | default(4000 + 60000 | random) }}" tasks: - name: Validate required AWS credentials assert: that: - aws_access_key is defined and aws_access_key != "" - aws_secret_key is defined and aws_secret_key != "" fail_msg: "AWS credentials are required. Set aws_access_key and aws_secret_key." - name: Create EC2 key pair for redirector amazon.aws.ec2_key: access_key: "{{ aws_access_key }}" secret_key: "{{ aws_secret_key }}" name: "{{ redirector_name }}" region: "{{ aws_region }}" state: present register: redirector_key_pair - name: Save private key locally copy: content: "{{ redirector_key_pair.key.private_key }}" dest: "~/.ssh/{{ redirector_name }}.pem" mode: "0600" when: redirector_key_pair.changed and redirector_key_pair.key.private_key is defined - name: Create a security group for the redirector amazon.aws.ec2_group: access_key: "{{ aws_access_key }}" secret_key: "{{ aws_secret_key }}" name: "{{ redirector_name }}-sg" description: "Security group for redirector {{ redirector_name }}" region: "{{ aws_region }}" rules: - proto: tcp ports: - 22 - 80 - 443 - "{{ shell_handler_port }}" cidr_ip: 0.0.0.0/0 rules_egress: - proto: -1 cidr_ip: 0.0.0.0/0 register: redirector_sg_result - name: Launch redirector EC2 instance amazon.aws.ec2_instance: access_key: "{{ aws_access_key }}" secret_key: "{{ aws_secret_key }}" region: "{{ aws_region }}" name: "{{ redirector_name }}" image_id: "{{ ami_map[aws_region] }}" instance_type: "{{ instance_type }}" key_name: "{{ redirector_name }}" security_groups: - "{{ redirector_name }}-sg" wait: yes tags: Name: "{{ redirector_name }}" Role: "redirector" register: redirector_instance - name: Set redirector_ip for later use set_fact: redirector_ip: "{{ redirector_instance.instances[0].public_ip_address }}" redirector_instance_id: "{{ redirector_instance.instances[0].instance_id }}" - name: Wait for redirector SSH to be available wait_for: host: "{{ redirector_ip }}" port: 22 delay: 30 timeout: 300 state: started - name: Add redirector to inventory add_host: name: "redirector" groups: "redirectors" ansible_host: "{{ redirector_ip }}" ansible_user: "{{ ssh_user }}" ansible_ssh_private_key_file: "~/.ssh/{{ redirector_name }}.pem" ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" - name: Configure redirector server hosts: redirectors become: true gather_facts: true vars_files: - vars.yaml vars: c2_ip: "{{ c2_ip | default('127.0.0.1') }}" redirector_subdomain: "{{ redirector_subdomain | default('cdn') }}" tasks: - name: Wait for apt to be available apt: update_cache: yes register: apt_result until: apt_result is success retries: 5 delay: 10 - name: Include common redirector configuration tasks include_tasks: "../tasks/configure_redirector.yml" - name: Include common security hardening tasks include_tasks: "../tasks/security_hardening.yml" - name: Print deployment summary debug: msg: - "Redirector Deployment Complete!" - "-------------------------------" - "Redirector IP: {{ ansible_host }}" - "Redirector Domain: {{ redirector_subdomain }}.{{ domain }} (Update DNS A record)" - "Shell Handler Port: {{ shell_handler_port }}" - "SSH Key: ~/.ssh/{{ redirector_name }}.pem" when: not disable_summary | default(false)