Created
December 15, 2021 12:39
-
-
Save aharonh/1acebbb432e36cff74342103c7baff30 to your computer and use it in GitHub Desktop.
patch all deployments and stateful sets containers in your kubernetes cluster for log4shell CVE-2021-44228 by appending environment variable that prevents the exploit. .
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# patch all deployments and stateful sets containers in your kubernetes cluster for | |
# log4shell CVE-2021-44228 by appending environment variable that prevents the exploit. | |
from kubernetes import client, config | |
config.load_kube_config() | |
apps_api = client.AppsV1Api() | |
deployments = apps_api.list_deployment_for_all_namespaces() | |
stateful_sets = apps_api.list_stateful_set_for_all_namespaces() | |
env_var_definition = {'name': 'LOG4J_FORMAT_MSG_NO_LOOKUPS', 'value': 'true', 'value_from': None} | |
def has_log4j_env_var(env_vars): | |
return any([ var.name == 'LOG4J_FORMAT_MSG_NO_LOOKUPS' for var in env_vars ]) | |
def patch_app(app, kind): | |
changed = False | |
for container in app.spec.template.spec.containers: | |
if container.env is None: | |
container.env = [] | |
if not has_log4j_env_var(container.env): | |
changed = True | |
container.env.append(env_var_definition) | |
if changed: | |
try: | |
print("patching %s %s in %s" % (kind, app.metadata.name, app.metadata.namespace) ) | |
if kind == 'deployment': | |
apps_api.patch_namespaced_deployment(name=app.metadata.name, namespace=app.metadata.namespace, body=app) | |
else: | |
apps_api.patch_namespaced_stateful_set(name=app.metadata.name, namespace=app.metadata.namespace, body=app) | |
print("patched %s %s in %s" % (kind, app.metadata.name, app.metadata.namespace) ) | |
except: | |
print("some error occured while patching %s %s in %s" % (kind, app.metadata.name, app.metadata.namespace) ) | |
for deployment in deployments.items: | |
patch_app(deployment, 'deployment') | |
for stateful_set in stateful_sets.items: | |
patch_app(stateful_set, 'sts') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment