Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Helm support for AWS Account posture scanner #2024

Open
2 of 6 tasks
lumattr opened this issue Mar 18, 2024 · 3 comments
Open
2 of 6 tasks

Add Helm support for AWS Account posture scanner #2024

lumattr opened this issue Mar 18, 2024 · 3 comments
Assignees
Labels
enhancement New feature or request needs-triage Indicates that issue is not yet triaged and assigned

Comments

@lumattr
Copy link

lumattr commented Mar 18, 2024

Additional context
It would be great if the AWS account scanner would be deployed in helm. I Appreaciate that it takes additional effort due to the need to have a Service account and an IAM role attached, but as i have the console and agents already in K8s its awkward to have a seperate ECS cluster for the account scanner.

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
Ideally it would be a helm chart that would run the cloud-scanner image, and would require me as the end user to create a role with the needed policy, attach that to a service account and pass that to the helm chart.

Describe alternatives you've considered
This could be a terraform module, but that wouldnt work for me specifically as we use CDK in house.

Components/Services

  • UI/Frontend
  • API/Backend
  • Agent
  • Deployment/YAMLs
  • CI/CD Integration
  • Other (specify) Account posture scanner

Additional context
This is how i am deploying it at the moment:

cloudscanner.ts

import { ICluster, KubernetesManifest } from "aws-cdk-lib/aws-eks";
import { ManagedPolicy } from "aws-cdk-lib/aws-iam";

const serviceName = "deepfence-cloud-scanner";

export function addCloudScanner(stack: Stack, cluster: ICluster, namespace: string, consoleUrl: url): KubernetesManifest {
  const serviceAccount = cluster.addServiceAccount("cloudScannerSA", {
    name: serviceName,
    namespace,
  });

  const policy = ManagedPolicy.fromManagedPolicyArn(stack, "auditPolicy", "arn:aws:iam::aws:policy/SecurityAudit");
  serviceAccount.role.addManagedPolicy(policy);

  return cluster.addManifest("console", {
    apiVersion: "apps/v1",
    kind: "Deployment",
    metadata: {
      name: serviceName,
      namespace,
    },
    spec: {
      selector: {
        matchLabels: {
          app: serviceName,
        },
      },
      replicas: 1,
      template: {
        metadata: {
          labels: {
            app: serviceName,
          },
        },
        spec: {
          serviceAccountName: serviceAccount.serviceAccountName,
          nodeSelector: {
            "kubernetes.io/arch": "amd64",
          },
          containers: [
            {
              name: "cloud-scanner",
              image: "deepfenceio/cloud-scanner:2.1.0",
              imagePullPolicy: "Always",
              args: [
                "-mode",
                "service",
                "-mgmt-console-url",
                consoleUrl
                "-debug",
                "true",
                "-cloud-audit-log-ids",
                `arn:aws:cloudtrail:${stack.region}:${stack.account}:trail/trail`,
              ],
              env: [
                {
                  name: "DEEPFENCE_KEY",
                  valueFrom: {
                    secretKeyRef: {
                      name: "deepfence-agent-key",
                      key: "deepfence-key",
                    },
                  },
                },
              ],
              resources: {
                requests: {
                  cpu: "2048m",
                  memory: "4096Mi",
                },
                limits: {
                  cpu: "4096m",
                  memory: "8192Mi",
                },
              },
            },
          ],
        },
      },
    },
  });
}

@lumattr lumattr added enhancement New feature or request needs-triage Indicates that issue is not yet triaged and assigned labels Mar 18, 2024
@ibreakthecloud
Copy link
Member

I understand the need of having cloud-scanner as a part of console/agent deployment. Currently we don't have it, but we can look into it.
cc: @gnmahanth

@lumattr
Copy link
Author

lumattr commented Mar 19, 2024

@ibreakthecloud @gnmahanth I appreciate you looking into this.

As far as i can see the way i have it running at the moment is working successfully. The only niggle with it is that the Account ID that its showing in the console is the Instance ID of the node the pod is running on.

Is there a way that can be overridden via an environment variable or a command arg or something?

@gnmahanth
Copy link
Contributor

@lumattr thanks for reporting the issue, there is no support for running cloud scanner on kubernetes we are looking into it

cc: @ibreakthecloud @jatin-baweja

Steps to reproduce the issue

  • create iam service account using eksctl on existing cluster
export CLUSTER_NAME=<cluster name>
eksctl create iamserviceaccount \
    --name cloud-scanner \
    --namespace cloud-scanner \
    --cluster $CLUSTER_NAME \
    --attach-policy-arn arn:aws:iam::aws:policy/SecurityAudit \
    --attach-policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \
    --approve \
    --override-existing-serviceaccounts
  • apply kuberenetes manifests for cloud scanner
kubectl apply -f cloud-scanner.yaml --namespace cloud-scanner
---
apiVersion: v1
kind: Secret
metadata:
  name: console-details
type: Opaque
stringData:
  deepfenceKey: "<deepfence key>"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: cloud-scanner
  name: cloud-scanner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cloud-scanner
  template:
    metadata:
      labels:
        app: cloud-scanner
    spec:
      serviceAccountName: cloud-scanner
      containers:
      - image: deepfenceio/cloud-scanner:2.1.1
        name: cloud-scanner
        args:
          - "-mode"
          - "service"
          - "-mgmt-console-url"
          - <console url>
          - "-debug"
          - "true"
          - "-cloud-audit-log-ids"
          - arn:aws:cloudtrail:<aws region>:<account id>:trail/trail
        env:
          - name: DEEPFENCE_KEY
            valueFrom:
              secretKeyRef: 
                name: "console-details"
                key: "deepfenceKey"
        resources: 
          requests:
            cpu: 1000m
            memory: 2048Mi
          limits:
            cpu: 4000m
            memory: 8192Mi

logs:

$ kubectl logs cloud-scanner-5747d74c4b-jsz8b -n cloud-scanner
Starting periodic command scheduler: cron.
time="2024-03-21 05:45:20" level=debug msg=NewComplianceScanService file="service.go:62"
{590323219893 x86_64 us-east-1f <nil> <nil> <nil> ami-0c67d4deba6eb4fba **<aws instance id>** t3.xlarge <nil> 2024-02-19 09:42:10 +0000 UTC 10.10.107.149 <nil> us-east-1 2017-09-30}
time="2024-03-21 05:45:20" level=debug msg="Building http client" file="client.go:56"
2024/03/21 05:45:20 [DEBUG] POST https://<console>:443/deepfence/auth/token
time="2024-03-21 05:45:20" level=warning msg="Task role is not set to arn:aws:iam::aws:policy/ReadOnlyAccess. Disabling CloudTrail based updates of cloud resources." file="cloudtrail.go:45"
time="2024-03-21 05:45:20" level=info msg="Registering with Deepfence management console" file="main.go:67"
time="2024-03-21 05:45:20" level=info msg="Restarting steampipe service" file="util.go:96"
time="2024-03-21 05:45:32" level=info msg="Steampipe service restarted" file="util.go:116"
2024/03/21 05:46:08 [DEBUG] POST https://<console>:443/deepfence/cloud-node/account
time="2024-03-21 05:46:08" level=warning msg="no cloudtrails found with management events and write or read-write mode" file="service.go:115"
time="2024-03-21 05:46:08" level=debug msg="Adding scans data to pending scans: map[]" file="client.go:194"
time="2024-03-21 05:46:08" level=info msg="Querying Resources" file="service.go:272"
time="2024-03-21 05:46:08" level=info msg="Started querying resources for aws: [**<aws instance id>**]" file="query.go:86"
time="2024-03-21 05:46:08" level=debug msg="Querying resources for aws_iam_account_summary" file="query.go:155"
2024/03/21 05:46:38 [DEBUG] POST https://<console>:443/deepfence/ingest/cloud-resources
time="2024-03-21 05:46:38" level=debug msg="Got length of 1 for aws_iam_account_summary" file="query.go:191"
time="2024-03-21 05:46:38" level=debug msg="Resources ingested: 1" file="client.go:243"
time="2024-03-21 05:46:38" level=debug msg="Querying resources for aws_account" file="query.go:155"

screen shot:
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request needs-triage Indicates that issue is not yet triaged and assigned
Projects
None yet
Development

No branches or pull requests

4 participants