def ssh_backend(**kwargs): token = handle_auth(**kwargs) url = urljoin(kwargs['url'], 'v1') secret_path = kwargs['secret_path'] role = kwargs['role'] cacert = kwargs.get('cacert', None) request_kwargs = {'timeout': 30} if cacert: request_kwargs['verify'] = create_temporary_fifo(cacert.encode()) request_kwargs['json'] = {'public_key': kwargs['public_key']} if kwargs.get('valid_principals'): request_kwargs['json']['valid_principals'] = kwargs['valid_principals'] sess = requests.Session() sess.headers['Authorization'] = 'Bearer {}'.format(token) # Compatability header for older installs of Hashicorp Vault sess.headers['X-Vault-Token'] = token # https://www.vaultproject.io/api/secret/ssh/index.html#sign-ssh-key request_url = '/'.join([url, secret_path, 'sign', role]).rstrip('/') resp = sess.post(request_url, **request_kwargs) resp.raise_for_status() return resp.json()['data']['signed_key']
def conjur_backend(**kwargs): url = kwargs['url'] api_key = kwargs['api_key'] account = quote_plus(kwargs['account']) username = quote_plus(kwargs['username']) secret_path = quote_plus(kwargs['secret_path']) version = kwargs.get('secret_version') cacert = kwargs.get('cacert', None) auth_kwargs = { 'headers': {'Content-Type': 'text/plain'}, 'data': api_key } if cacert: auth_kwargs['verify'] = create_temporary_fifo(cacert.encode()) # https://www.conjur.org/api.html#authentication-authenticate-post resp = requests.post( urljoin(url, '/'.join(['authn', account, username, 'authenticate'])), **auth_kwargs ) resp.raise_for_status() token = base64.b64encode(resp.content).decode('utf-8') lookup_kwargs = { 'headers': {'Authorization': 'Token token="{}"'.format(token)}, } if cacert: lookup_kwargs['verify'] = create_temporary_fifo(cacert.encode()) # https://www.conjur.org/api.html#secrets-retrieve-a-secret-get path = urljoin(url, '/'.join([ 'secrets', account, 'variable', secret_path ])) if version: path = '?'.join([path, version]) resp = requests.get(path, timeout=30, **lookup_kwargs) resp.raise_for_status() return resp.text
def kv_backend(**kwargs): token = handle_auth(**kwargs) url = kwargs['url'] secret_path = kwargs['secret_path'] secret_backend = kwargs.get('secret_backend', None) secret_key = kwargs.get('secret_key', None) cacert = kwargs.get('cacert', None) api_version = kwargs['api_version'] request_kwargs = {'timeout': 30} if cacert: request_kwargs['verify'] = create_temporary_fifo(cacert.encode()) sess = requests.Session() sess.headers['Authorization'] = 'Bearer {}'.format(token) # Compatability header for older installs of Hashicorp Vault sess.headers['X-Vault-Token'] = token if api_version == 'v2': if kwargs.get('secret_version'): request_kwargs['params'] = {'version': kwargs['secret_version']} if secret_backend: path_segments = [secret_backend, 'data', secret_path] else: try: mount_point, *path = pathlib.Path(secret_path.lstrip( os.sep)).parts '/'.join(path) except Exception: mount_point, path = secret_path, [] # https://www.vaultproject.io/api/secret/kv/kv-v2.html#read-secret-version path_segments = [mount_point, 'data'] + path else: if secret_backend: path_segments = [secret_backend, secret_path] else: path_segments = [secret_path] request_url = urljoin(url, '/'.join(['v1'] + path_segments)).rstrip('/') response = sess.get(request_url, **request_kwargs) response.raise_for_status() json = response.json() if api_version == 'v2': json = json['data'] if secret_key: try: return json['data'][secret_key] except KeyError: raise RuntimeError('{} is not present at {}'.format( secret_key, secret_path)) return json['data']
def aim_backend(**kwargs): url = kwargs['url'] client_cert = kwargs.get('client_cert', None) client_key = kwargs.get('client_key', None) verify = kwargs['verify'] app_id = kwargs['app_id'] object_query = kwargs['object_query'] object_query_format = kwargs['object_query_format'] reason = kwargs.get('reason', None) query_params = { 'AppId': app_id, 'Query': object_query, 'QueryFormat': object_query_format, } if reason: query_params['reason'] = reason request_qs = '?' + urlencode(query_params, quote_via=quote) request_url = urljoin(url, '/'.join(['AIMWebService', 'api', 'Accounts'])) cert = None if client_cert and client_key: cert = (create_temporary_fifo(client_cert.encode()), create_temporary_fifo(client_key.encode())) elif client_cert: cert = create_temporary_fifo(client_cert.encode()) res = requests.get( request_url + request_qs, timeout=30, cert=cert, verify=verify, ) res.raise_for_status() return res.json()['Content']
def test_kubectl_ssl_verification(containerized_job, execution_environment): cred = containerized_job.instance_group.credential cred.inputs['verify_ssl'] = True key_material = subprocess.run('openssl genrsa 2> /dev/null', shell=True, check=True, stdout=subprocess.PIPE) key = create_temporary_fifo(key_material.stdout) cmd = f""" openssl req -x509 -sha256 -new -nodes \ -key {key} -subj '/C=US/ST=North Carolina/L=Durham/O=Ansible/OU=AWX Development/CN=awx.localhost' """ cert = subprocess.run(cmd.strip(), shell=True, check=True, stdout=subprocess.PIPE) cred.inputs['ssl_ca_cert'] = cert.stdout cred.save() RunJob = namedtuple('RunJob', ['instance', 'build_execution_environment_params']) rj = RunJob(instance=containerized_job, build_execution_environment_params=lambda x: {}) receptor_job = AWXReceptorJob(rj, runner_params={'settings': {}}) ca_data = receptor_job.kube_config['clusters'][0]['cluster']['certificate-authority-data'] assert cert.stdout == base64.b64decode(ca_data.encode())
def test_kubectl_ssl_verification(containerized_job): cred = containerized_job.instance_group.credential cred.inputs['verify_ssl'] = True key_material = subprocess.run('openssl genrsa 2> /dev/null', shell=True, check=True, stdout=subprocess.PIPE) key = create_temporary_fifo(key_material.stdout) cmd = f""" openssl req -x509 -sha256 -new -nodes \ -key {key} -subj '/C=US/ST=North Carolina/L=Durham/O=Ansible/OU=AWX Development/CN=awx.localhost' """ cert = subprocess.run(cmd.strip(), shell=True, check=True, stdout=subprocess.PIPE) cred.inputs['ssl_ca_cert'] = cert.stdout cred.save() pm = PodManager(containerized_job) ca_data = pm.kube_config['clusters'][0]['cluster']['certificate-authority-data'] assert cert.stdout == base64.b64decode(ca_data.encode())
def kv_backend(**kwargs): token = kwargs['token'] url = urljoin(kwargs['url'], 'v1') secret_path = kwargs['secret_path'] secret_key = kwargs.get('secret_key', None) cacert = kwargs.get('cacert', None) api_version = kwargs['api_version'] request_kwargs = {'timeout': 30} if cacert: request_kwargs['verify'] = create_temporary_fifo(cacert.encode()) sess = requests.Session() sess.headers['Authorization'] = 'Bearer {}'.format(token) if api_version == 'v2': if kwargs.get('secret_version'): request_kwargs['params'] = {'version': kwargs['secret_version']} try: mount_point, *path = pathlib.Path(secret_path.lstrip(os.sep)).parts '/'.join(path) except Exception: mount_point, path = secret_path, [] # https://www.vaultproject.io/api/secret/kv/kv-v2.html#read-secret-version request_url = '/'.join([url, mount_point, 'data'] + path).rstrip('/') response = sess.get(request_url, **request_kwargs) response.raise_for_status() json = response.json()['data'] else: request_url = '/'.join([url, secret_path]).rstrip('/') response = sess.get(request_url, **request_kwargs) response.raise_for_status() json = response.json() if secret_key: try: return json['data'][secret_key] except KeyError: raise RuntimeError('{} is not present at {}'.format( secret_key, secret_path)) return json['data']
def approle_auth(**kwargs): role_id = kwargs['role_id'] secret_id = kwargs['secret_id'] auth_path = kwargs.get('auth_path') or 'approle' url = urljoin(kwargs['url'], 'v1') cacert = kwargs.get('cacert', None) request_kwargs = {'timeout': 30} if cacert: request_kwargs['verify'] = create_temporary_fifo(cacert.encode()) # AppRole Login request_kwargs['json'] = {'role_id': role_id, 'secret_id': secret_id} sess = requests.Session() request_url = '/'.join([url, 'auth', auth_path, 'login']).rstrip('/') resp = sess.post(request_url, **request_kwargs) resp.raise_for_status() token = resp.json()['auth']['client_token'] return token