# copied from https://github.com/openshift/api/blob/release-4.8/security/v1/0000_03_security-openshift_01_scc.crd.yaml
# commented where modified from original
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    api-approved.openshift.io: https://github.com/openshift/api/pull/470
    include.release.openshift.io/ibm-cloud-managed: "true"
    include.release.openshift.io/self-managed-high-availability: "true"
    include.release.openshift.io/single-node-developer: "true"
  name: securitycontextconstraints.security.openshift.io
spec:
  group: security.openshift.io
  names:
    kind: SecurityContextConstraints
    listKind: SecurityContextConstraintsList
    plural: securitycontextconstraints
    singular: securitycontextconstraints
    shortNames: # modified from openshift/api, openshift/api registers with openshift-apiserver, and shorNames()
    - scc       # same shortNames as OCP but with CRD instead of openshift-apiserver
  scope: Cluster
  versions:
  - additionalPrinterColumns:
    - description: Determines if a container can request to be run as privileged
      jsonPath: .allowPrivilegedContainer
      name: Priv
      type: string
    - description: A list of capabilities that can be requested to add to the container
      jsonPath: .allowedCapabilities
      name: Caps
      type: string
    - description: Strategy that will dictate what labels will be set in the SecurityContext
      jsonPath: .seLinuxContext.type
      name: SELinux
      type: string
    - description: Strategy that will dictate what RunAsUser is used in the SecurityContext
      jsonPath: .runAsUser.type
      name: RunAsUser
      type: string
    - description: Strategy that will dictate what fs group is used by the SecurityContext
      jsonPath: .fsGroup.type
      name: FSGroup
      type: string
    - description: Strategy that will dictate what supplemental groups are used by
        the SecurityContext
      jsonPath: .supplementalGroups.type
      name: SupGroup
      type: string
    - description: Sort order of SCCs
      jsonPath: .priority
      name: Priority
      type: string
    - description: Force containers to run with a read only root file system
      jsonPath: .readOnlyRootFilesystem
      name: ReadOnlyRootFS
      type: string
    - description: White list of allowed volume plugins
      jsonPath: .volumes
      name: Volumes
      type: string
    name: v1
    schema:
      openAPIV3Schema:
        description: SecurityContextConstraints governs the ability to make requests
          that affect the SecurityContext that will be applied to a container. For
          historical reasons SCC was exposed under the core Kubernetes API group.
          That exposure is deprecated and will be removed in a future release - users
          should instead use the security.openshift.io group to manage SecurityContextConstraints.
        type: object
        required:
        - allowHostDirVolumePlugin
        - allowHostIPC
        - allowHostNetwork
        - allowHostPID
        - allowHostPorts
        - allowPrivilegedContainer
        - readOnlyRootFilesystem
        - volumes
        # removed 'nullable: true' required fields from openshift/api definition
        # to avoid carrying patch for openAPIV3Schema validation
        # - volumes - while nullable, keep required, because it shouldn't be nullable
        # - allowedCapabilities
        # - defaultAddCapabilities
        # - priority
        # - requiredDropCapabilities
        properties:
          allowHostDirVolumePlugin:
            description: AllowHostDirVolumePlugin determines if the policy allow containers
              to use the HostDir volume plugin
            type: boolean
          allowHostIPC:
            description: AllowHostIPC determines if the policy allows host ipc in
              the containers.
            type: boolean
          allowHostNetwork:
            description: AllowHostNetwork determines if the policy allows the use
              of HostNetwork in the pod spec.
            type: boolean
          allowHostPID:
            description: AllowHostPID determines if the policy allows host pid in
              the containers.
            type: boolean
          allowHostPorts:
            description: AllowHostPorts determines if the policy allows host ports
              in the containers.
            type: boolean
          allowPrivilegeEscalation:
            description: AllowPrivilegeEscalation determines if a pod can request
              to allow privilege escalation. If unspecified, defaults to true.
            type: boolean
            nullable: true
          allowPrivilegedContainer:
            description: AllowPrivilegedContainer determines if a container can request
              to be run as privileged.
            type: boolean
          allowedCapabilities:
            description: AllowedCapabilities is a list of capabilities that can be
              requested to add to the container. Capabilities in this field maybe
              added at the pod author's discretion. You must not list a capability
              in both AllowedCapabilities and RequiredDropCapabilities. To allow all
              capabilities you may use '*'.
            type: array
            items:
              description: Capability represent POSIX capabilities type
              type: string
            nullable: true
          allowedFlexVolumes:
            description: AllowedFlexVolumes is a whitelist of allowed Flexvolumes.  Empty
              or nil indicates that all Flexvolumes may be used.  This parameter is
              effective only when the usage of the Flexvolumes is allowed in the "Volumes"
              field.
            type: array
            items:
              description: AllowedFlexVolume represents a single Flexvolume that is
                allowed to be used.
              type: object
              required:
              - driver
              properties:
                driver:
                  description: Driver is the name of the Flexvolume driver.
                  type: string
            nullable: true
          allowedUnsafeSysctls:
            description: "AllowedUnsafeSysctls is a list of explicitly allowed unsafe
              sysctls, defaults to none. Each entry is either a plain sysctl name
              or ends in \"*\" in which case it is considered as a prefix of allowed
              sysctls. Single * means all unsafe sysctls are allowed. Kubelet has
              to whitelist all allowed unsafe sysctls explicitly to avoid rejection.
              \n Examples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g.
              \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc."
            type: array
            items:
              type: string
            nullable: true
          apiVersion:
            description: 'APIVersion defines the versioned schema of this representation
              of an object. Servers should convert recognized schemas to the latest
              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
            type: string
          defaultAddCapabilities:
            description: DefaultAddCapabilities is the default set of capabilities
              that will be added to the container unless the pod spec specifically
              drops the capability.  You may not list a capabiility in both DefaultAddCapabilities
              and RequiredDropCapabilities.
            type: array
            items:
              description: Capability represent POSIX capabilities type
              type: string
            nullable: true
          defaultAllowPrivilegeEscalation:
            description: DefaultAllowPrivilegeEscalation controls the default setting
              for whether a process can gain more privileges than its parent process.
            type: boolean
            nullable: true
          forbiddenSysctls:
            description: "ForbiddenSysctls is a list of explicitly forbidden sysctls,
              defaults to none. Each entry is either a plain sysctl name or ends in
              \"*\" in which case it is considered as a prefix of forbidden sysctls.
              Single * means all sysctls are forbidden. \n Examples: e.g. \"foo/*\"
              forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\",
              \"foo.baz\", etc."
            type: array
            items:
              type: string
            nullable: true
          fsGroup:
            description: FSGroup is the strategy that will dictate what fs group is
              used by the SecurityContext.
            type: object
            properties:
              ranges:
                description: Ranges are the allowed ranges of fs groups.  If you would
                  like to force a single fs group then supply a single range with
                  the same start and end.
                type: array
                items:
                  description: 'IDRange provides a min/max of an allowed range of
                    IDs. TODO: this could be reused for UIDs.'
                  type: object
                  properties:
                    max:
                      description: Max is the end of the range, inclusive.
                      type: integer
                      format: int64
                    min:
                      description: Min is the start of the range, inclusive.
                      type: integer
                      format: int64
              type:
                description: Type is the strategy that will dictate what FSGroup is
                  used in the SecurityContext.
                type: string
            nullable: true
          groups:
            description: The groups that have permission to use this security context
              constraints
            type: array
            items:
              type: string
            nullable: true
          kind:
            description: 'Kind is a string value representing the REST resource this
              object represents. Servers may infer this from the endpoint the client
              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
            type: string
          metadata:
            type: object
          priority:
            description: Priority influences the sort order of SCCs when evaluating
              which SCCs to try first for a given pod request based on access in the
              Users and Groups fields.  The higher the int, the higher priority. An
              unset value is considered a 0 priority. If scores for multiple SCCs
              are equal they will be sorted from most restrictive to least restrictive.
              If both priorities and restrictions are equal the SCCs will be sorted
              by name.
            type: integer
            format: int32
            nullable: true
          readOnlyRootFilesystem:
            description: ReadOnlyRootFilesystem when set to true will force containers
              to run with a read only root file system.  If the container specifically
              requests to run with a non-read only root file system the SCC should
              deny the pod. If set to false the container may run with a read only
              root file system if it wishes but it will not be forced to.
            type: boolean
          requiredDropCapabilities:
            description: RequiredDropCapabilities are the capabilities that will be
              dropped from the container.  These are required to be dropped and cannot
              be added.
            type: array
            items:
              description: Capability represent POSIX capabilities type
              type: string
            nullable: true
          runAsUser:
            description: RunAsUser is the strategy that will dictate what RunAsUser
              is used in the SecurityContext.
            type: object
            properties:
              type:
                description: Type is the strategy that will dictate what RunAsUser
                  is used in the SecurityContext.
                type: string
              uid:
                description: UID is the user id that containers must run as.  Required
                  for the MustRunAs strategy if not using namespace/service account
                  allocated uids.
                type: integer
                format: int64
              uidRangeMax:
                description: UIDRangeMax defines the max value for a strategy that
                  allocates by range.
                type: integer
                format: int64
              uidRangeMin:
                description: UIDRangeMin defines the min value for a strategy that
                  allocates by range.
                type: integer
                format: int64
            nullable: true
          seLinuxContext:
            description: SELinuxContext is the strategy that will dictate what labels
              will be set in the SecurityContext.
            type: object
            properties:
              seLinuxOptions:
                description: seLinuxOptions required to run as; required for MustRunAs
                type: object
                properties:
                  level:
                    description: Level is SELinux level label that applies to the
                      container.
                    type: string
                  role:
                    description: Role is a SELinux role label that applies to the
                      container.
                    type: string
                  type:
                    description: Type is a SELinux type label that applies to the
                      container.
                    type: string
                  user:
                    description: User is a SELinux user label that applies to the
                      container.
                    type: string
              type:
                description: Type is the strategy that will dictate what SELinux context
                  is used in the SecurityContext.
                type: string
            nullable: true
          seccompProfiles:
            description: "SeccompProfiles lists the allowed profiles that may be set
              for the pod or container's seccomp annotations.  An unset (nil) or empty
              value means that no profiles may be specifid by the pod or container.\tThe
              wildcard '*' may be used to allow all profiles.  When used to generate
              a value for a pod the first non-wildcard profile will be used as the
              default."
            type: array
            items:
              type: string
            nullable: true
          supplementalGroups:
            description: SupplementalGroups is the strategy that will dictate what
              supplemental groups are used by the SecurityContext.
            type: object
            properties:
              ranges:
                description: Ranges are the allowed ranges of supplemental groups.  If
                  you would like to force a single supplemental group then supply
                  a single range with the same start and end.
                type: array
                items:
                  description: 'IDRange provides a min/max of an allowed range of
                    IDs. TODO: this could be reused for UIDs.'
                  type: object
                  properties:
                    max:
                      description: Max is the end of the range, inclusive.
                      type: integer
                      format: int64
                    min:
                      description: Min is the start of the range, inclusive.
                      type: integer
                      format: int64
              type:
                description: Type is the strategy that will dictate what supplemental
                  groups is used in the SecurityContext.
                type: string
            nullable: true
          users:
            description: The users who have permissions to use this security context
              constraints
            type: array
            items:
              type: string
            nullable: true
          volumes:
            description: Volumes is a white list of allowed volume plugins.  FSType
              corresponds directly with the field names of a VolumeSource (azureFile,
              configMap, emptyDir).  To allow all volumes you may use "*". To allow
              no volumes, set to ["none"].
            type: array
            items:
              description: FS Type gives strong typing to different file systems that
                are used by volumes.
              type: string
            nullable: true
    served: true
    storage: true
