/************************************************************************* * Copyright 2009-2015 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. * * This file may incorporate work covered under the following copyright * and permission notice: * * Software License Agreement (BSD License) * * Copyright (c) 2008, Regents of the University of California * All rights reserved. * * Redistribution and use of this software in source and binary forms, * with or without modification, are permitted provided that the * following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. USERS OF THIS SOFTWARE ACKNOWLEDGE * THE POSSIBLE PRESENCE OF OTHER OPEN SOURCE LICENSED MATERIAL, * COPYRIGHTED MATERIAL OR PATENTED MATERIAL IN THIS SOFTWARE, * AND IF ANY SUCH MATERIAL IS DISCOVERED THE PARTY DISCOVERING * IT MAY INFORM DR. RICH WOLSKI AT THE UNIVERSITY OF CALIFORNIA, * SANTA BARBARA WHO WILL THEN ASCERTAIN THE MOST APPROPRIATE REMEDY, * WHICH IN THE REGENTS' DISCRETION MAY INCLUDE, WITHOUT LIMITATION, * REPLACEMENT OF THE CODE SO IDENTIFIED, LICENSING OF THE CODE SO * IDENTIFIED, OR WITHDRAWAL OF THE CODE CAPABILITY TO THE EXTENT * NEEDED TO COMPLY WITH ANY SUCH LICENSES OR RIGHTS. ************************************************************************/ package com.eucalyptus.auth.policy; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import com.eucalyptus.auth.principal.Authorization.EffectType; import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterators; /** * NOTE: Please do not add service specific IAM policy details here. */ public class PolicySpec { public static final String VERSION = "Version"; public static final String STATEMENT = "Statement"; public static final String SID = "Sid"; public static final String EFFECT = "Effect"; public static final String ACTION = "Action"; public static final String NOTACTION = "NotAction"; public static final String RESOURCE = "Resource"; public static final String NOTRESOURCE = "NotResource"; public static final String PRINCIPAL = "Principal"; public static final String NOTPRINCIPAL = "NotPrincipal"; public static final String CONDITION = "Condition"; // Effect public static final Set<String> EFFECTS = ImmutableSet.copyOf( Iterators.transform( Iterators.forArray(EffectType.values()), new Function<EffectType,String>() { @Override public String apply( final EffectType effect ) { return effect.name( ); } }) ); // Vendor (AWS products) // Do not add vendors here (use modules) public static final String VENDOR_IAM = "iam"; public static final String VENDOR_EC2 = "ec2"; public static final String VENDOR_STS = "sts"; public static final String VENDOR_IMAGINGSERVICE = "eucaimaging"; // Do not add vendors here (use modules) public static final String ALL_PRINCIPALS = "*"; public static final String ALL_ACTION = "*"; // EC2 actions, based on API version 2013-07-15 public static final String EC2_ALLOCATEADDRESS = "allocateaddress"; public static final String EC2_ASSIGNPRIVATEIPADDRESSES = "assignprivateipaddresses"; public static final String EC2_ASSOCIATEADDRESS = "associateaddress"; public static final String EC2_ASSOCIATEDHCPOPTIONS = "associatedhcpoptions"; public static final String EC2_ASSOCIATEROUTETABLE = "associateroutetable"; public static final String EC2_ATTACHINTERNETGATEWAY = "attachinternetgateway"; public static final String EC2_ATTACHNETWORKINTERFACE = "attachnetworkinterface"; public static final String EC2_ATTACHVOLUME = "attachvolume"; public static final String EC2_ATTACHVPNGATEWAY = "attachvpngateway"; public static final String EC2_AUTHORIZESECURITYGROUPEGRESS = "authorizesecuritygroupegress"; public static final String EC2_AUTHORIZESECURITYGROUPINGRESS = "authorizesecuritygroupingress"; public static final String EC2_BUNDLEINSTANCE = "bundleinstance"; public static final String EC2_CANCELBUNDLETASK = "cancelbundletask"; public static final String EC2_CANCELCONVERSIONTASK = "cancelconversiontask"; public static final String EC2_CANCELEXPORTTASK = "cancelexporttask"; public static final String EC2_CANCELRESERVEDINSTANCESLISTING = "cancelreservedinstanceslisting"; public static final String EC2_CANCELSPOTINSTANCEREQUESTS = "cancelspotinstancerequests"; public static final String EC2_CONFIRMPRODUCTINSTANCE = "confirmproductinstance"; public static final String EC2_COPYIMAGE = "copyimage"; public static final String EC2_COPYSNAPSHOT = "copysnapshot"; public static final String EC2_CREATECUSTOMERGATEWAY = "createcustomergateway"; public static final String EC2_CREATEDHCPOPTIONS = "createdhcpoptions"; public static final String EC2_CREATEIMAGE = "createimage"; public static final String EC2_CREATEINSTANCEEXPORTTASK = "createinstanceexporttask"; public static final String EC2_CREATEINTERNETGATEWAY = "createinternetgateway"; public static final String EC2_CREATEKEYPAIR = "createkeypair"; public static final String EC2_CREATENETWORKACL = "createnetworkacl"; public static final String EC2_CREATENETWORKACLENTRY = "createnetworkaclentry"; public static final String EC2_CREATENETWORKINTERFACE = "createnetworkinterface"; public static final String EC2_CREATEPLACEMENTGROUP = "createplacementgroup"; public static final String EC2_CREATERESERVEDINSTANCESLISTING = "createreservedinstanceslisting"; public static final String EC2_CREATEROUTE = "createroute"; public static final String EC2_CREATEROUTETABLE = "createroutetable"; public static final String EC2_CREATESECURITYGROUP = "createsecuritygroup"; public static final String EC2_CREATESNAPSHOT = "createsnapshot"; public static final String EC2_CREATESPOTDATAFEEDSUBSCRIPTION = "createspotdatafeedsubscription"; public static final String EC2_CREATESUBNET = "createsubnet"; public static final String EC2_CREATETAGS = "createtags"; public static final String EC2_CREATEVOLUME = "createvolume"; public static final String EC2_CREATEVPC = "createvpc"; public static final String EC2_CREATEVPNCONNECTION = "createvpnconnection"; public static final String EC2_CREATEVPNCONNECTIONROUTE = "createvpnconnectionroute"; public static final String EC2_CREATEVPNGATEWAY = "createvpngateway"; public static final String EC2_DELETECUSTOMERGATEWAY = "deletecustomergateway"; public static final String EC2_DELETEDHCPOPTIONS = "deletedhcpoptions"; public static final String EC2_DELETEINTERNETGATEWAY = "deleteinternetgateway"; public static final String EC2_DELETEKEYPAIR = "deletekeypair"; public static final String EC2_DELETENETWORKACL = "deletenetworkacl"; public static final String EC2_DELETENETWORKACLENTRY = "deletenetworkaclentry"; public static final String EC2_DELETENETWORKINTERFACE = "deletenetworkinterface"; public static final String EC2_DELETEPLACEMENTGROUP = "deleteplacementgroup"; public static final String EC2_DELETEROUTE = "deleteroute"; public static final String EC2_DELETEROUTETABLE = "deleteroutetable"; public static final String EC2_DELETESECURITYGROUP = "deletesecuritygroup"; public static final String EC2_DELETESNAPSHOT = "deletesnapshot"; public static final String EC2_DELETESPOTDATAFEEDSUBSCRIPTION = "deletespotdatafeedsubscription"; public static final String EC2_DELETESUBNET = "deletesubnet"; public static final String EC2_DELETETAGS = "deletetags"; public static final String EC2_DELETEVOLUME = "deletevolume"; public static final String EC2_DELETEVPC = "deletevpc"; public static final String EC2_DELETEVPNCONNECTION = "deletevpnconnection"; public static final String EC2_DELETEVPNCONNECTIONROUTE = "deletevpnconnectionroute"; public static final String EC2_DELETEVPNGATEWAY = "deletevpngateway"; public static final String EC2_DEREGISTERIMAGE = "deregisterimage"; public static final String EC2_DESCRIBEACCOUNTATTRIBUTES = "describeaccountattributes"; public static final String EC2_DESCRIBEADDRESSES = "describeaddresses"; public static final String EC2_DESCRIBEAVAILABILITYZONES = "describeavailabilityzones"; public static final String EC2_DESCRIBEBUNDLETASKS = "describebundletasks"; public static final String EC2_DESCRIBECONVERSIONTASKS = "describeconversiontasks"; public static final String EC2_DESCRIBECUSTOMERGATEWAYS = "describecustomergateways"; public static final String EC2_DESCRIBEDHCPOPTIONS = "describedhcpoptions"; public static final String EC2_DESCRIBEEXPORTTASKS = "describeexporttasks"; public static final String EC2_DESCRIBEIMAGEATTRIBUTE = "describeimageattribute"; public static final String EC2_DESCRIBEIMAGES = "describeimages"; public static final String EC2_DESCRIBEINSTANCEATTRIBUTE = "describeinstanceattribute"; public static final String EC2_DESCRIBEINSTANCES = "describeinstances"; public static final String EC2_DESCRIBEINSTANCESTATUS = "describeinstancestatus"; public static final String EC2_DESCRIBEINSTANCETYPES = "describeinstancetypes"; public static final String EC2_DESCRIBEINTERNETGATEWAYS = "describeinternetgateways"; public static final String EC2_DESCRIBEKEYPAIRS = "describekeypairs"; public static final String EC2_DESCRIBENETWORKACLS = "describenetworkacls"; public static final String EC2_DESCRIBENETWORKINTERFACEATTRIBUTE = "describenetworkinterfaceattribute"; public static final String EC2_DESCRIBENETWORKINTERFACES = "describenetworkinterfaces"; public static final String EC2_DESCRIBEPLACEMENTGROUPS = "describeplacementgroups"; public static final String EC2_DESCRIBEREGIONS = "describeregions"; public static final String EC2_DESCRIBERESERVEDINSTANCES = "describereservedinstances"; public static final String EC2_DESCRIBERESERVEDINSTANCESLISTINGS = "describereservedinstanceslistings"; public static final String EC2_DESCRIBERESERVEDINSTANCESMODIFICATIONS = "describereservedinstancesmodifications"; public static final String EC2_DESCRIBERESERVEDINSTANCESOFFERINGS = "describereservedinstancesofferings"; public static final String EC2_DESCRIBEROUTETABLES = "describeroutetables"; public static final String EC2_DESCRIBESECURITYGROUPS = "describesecuritygroups"; public static final String EC2_DESCRIBESNAPSHOTATTRIBUTE = "describesnapshotattribute"; public static final String EC2_DESCRIBESNAPSHOTS = "describesnapshots"; public static final String EC2_DESCRIBESPOTDATAFEEDSUBSCRIPTION = "describespotdatafeedsubscription"; public static final String EC2_DESCRIBESPOTINSTANCEREQUESTS = "describespotinstancerequests"; public static final String EC2_DESCRIBESPOTPRICEHISTORY = "describespotpricehistory"; public static final String EC2_DESCRIBESUBNETS = "describesubnets"; public static final String EC2_DESCRIBETAGS = "describetags"; public static final String EC2_DESCRIBEVOLUMEATTRIBUTE = "describevolumeattribute"; public static final String EC2_DESCRIBEVOLUMES = "describevolumes"; public static final String EC2_DESCRIBEVOLUMESTATUS = "describevolumestatus"; public static final String EC2_DESCRIBEVPCATTRIBUTE = "describevpcattribute"; public static final String EC2_DESCRIBEVPCS = "describevpcs"; public static final String EC2_DESCRIBEVPNCONNECTIONS = "describevpnconnections"; public static final String EC2_DESCRIBEVPNGATEWAYS = "describevpngateways"; public static final String EC2_DETACHINTERNETGATEWAY = "detachinternetgateway"; public static final String EC2_DETACHNETWORKINTERFACE = "detachnetworkinterface"; public static final String EC2_DETACHVOLUME = "detachvolume"; public static final String EC2_DETACHVPNGATEWAY = "detachvpngateway"; public static final String EC2_DISABLEVGWROUTEPROPAGATION = "disablevgwroutepropagation"; public static final String EC2_DISASSOCIATEADDRESS = "disassociateaddress"; public static final String EC2_DISASSOCIATEROUTETABLE = "disassociateroutetable"; public static final String EC2_ENABLEVGWROUTEPROPAGATION = "enablevgwroutepropagation"; public static final String EC2_ENABLEVOLUMEIO = "enablevolumeio"; public static final String EC2_GETCONSOLEOUTPUT = "getconsoleoutput"; public static final String EC2_GETPASSWORDDATA = "getpassworddata"; public static final String EC2_IMPORTINSTANCE = "importinstance"; public static final String EC2_IMPORTKEYPAIR = "importkeypair"; public static final String EC2_IMPORTVOLUME = "importvolume"; public static final String EC2_MIGRATEINSTANCES = "migrateinstances"; // eucalyptus administrative extension public static final String EC2_MODIFYIMAGEATTRIBUTE = "modifyimageattribute"; public static final String EC2_MODIFYINSTANCEATTRIBUTE = "modifyinstanceattribute"; public static final String EC2_MODIFYNETWORKINTERFACEATTRIBUTE = "modifynetworkinterfaceattribute"; public static final String EC2_MODIFYRESERVEDINSTANCES = "modifyreservedinstances"; public static final String EC2_MODIFYSNAPSHOTATTRIBUTE = "modifysnapshotattribute"; public static final String EC2_MODIFYVOLUMEATTRIBUTE = "modifyvolumeattribute"; public static final String EC2_MODIFYVMTYPE = "modifyvmtype"; // eucalyptus administrative extension public static final String EC2_MODIFYVPCATTRIBUTE = "modifyvpcattribute"; public static final String EC2_MONITORINSTANCES = "monitorinstances"; public static final String EC2_PURCHASERESERVEDINSTANCESOFFERING = "purchasereservedinstancesoffering"; public static final String EC2_REBOOTINSTANCES = "rebootinstances"; public static final String EC2_REGISTERIMAGE = "registerimage"; public static final String EC2_RELEASEADDRESS = "releaseaddress"; public static final String EC2_REPLACENETWORKACLASSOCIATION = "replacenetworkaclassociation"; public static final String EC2_REPLACENETWORKACLENTRY = "replacenetworkaclentry"; public static final String EC2_REPLACEROUTE = "replaceroute"; public static final String EC2_REPLACEROUTETABLEASSOCIATION = "replaceroutetableassociation"; public static final String EC2_REPORTINSTANCESTATUS = "reportinstancestatus"; public static final String EC2_REQUESTSPOTINSTANCES = "requestspotinstances"; public static final String EC2_RESETIMAGEATTRIBUTE = "resetimageattribute"; public static final String EC2_RESETINSTANCEATTRIBUTE = "resetinstanceattribute"; public static final String EC2_RESETNETWORKINTERFACEATTRIBUTE = "resetnetworkinterfaceattribute"; public static final String EC2_RESETSNAPSHOTATTRIBUTE = "resetsnapshotattribute"; public static final String EC2_REVOKESECURITYGROUPEGRESS = "revokesecuritygroupegress"; public static final String EC2_REVOKESECURITYGROUPINGRESS = "revokesecuritygroupingress"; public static final String EC2_RUNINSTANCES = "runinstances"; public static final String EC2_STARTINSTANCES = "startinstances"; public static final String EC2_STOPINSTANCES = "stopinstances"; public static final String EC2_TERMINATEINSTANCES = "terminateinstances"; public static final String EC2_UNASSIGNPRIVATEIPADDRESSES = "unassignprivateipaddresses"; public static final String EC2_UNMONITORINSTANCES = "unmonitorinstances"; // Deprecated EC2 actions public static final String EC2_ACTIVATELICENSE = "activatelicense"; public static final String EC2_DEACTIVATELICENSE = "deactivatelicense"; public static final String EC2_DESCRIBELICENSES = "describelicenses"; // STS actions, based on IAM Using Temporary Security Credentials version 2011-06-15 public static final String STS_ASSUMEROLE = "assumerole"; public static final String STS_ASSUMEROLEWITHWEBIDENTITY = "assumerolewithwebidentity"; public static final String STS_DECODEAUTHORIZATIONMESSAGE = "decodeauthorizationmessage"; public static final String STS_GETACCESSTOKEN = "getaccesstoken"; // eucalyptus extension public static final String STS_GETCALLERIDENTITY = "getcalleridentity"; public static final String STS_GETFEDERATIONTOKEN = "getfederationtoken"; public static final String STS_GETIMPERSONATIONTOKEN = "getimpersonationtoken"; // eucalyptus extension public static final String STS_GETSESSIONTOKEN = "getsessiontoken"; // Map vendors to resource vendors public static final Map<String, Set<String>> VENDOR_RESOURCE_VENDORS = new ImmutableMap.Builder<String,Set<String>>() .put( VENDOR_STS, ImmutableSet.of( VENDOR_IAM ) ) .build(); // Set of vendors with case insensitive resource names public static final Set<String> VENDORS_CASE_INSENSITIVE_RESOURCES = new ImmutableSet.Builder<String>() .add( VENDOR_EC2 ) .build(); // Action syntax public static final Pattern ACTION_PATTERN = Pattern.compile( "\\*|(?:([a-z0-9]+):(\\S+))" ); // Wildcard public static final String ALL_RESOURCE = "*"; // IAM resource types (see IamPolicySpec for all resources) public static final String IAM_RESOURCE_USER = "user"; public static final String IAM_RESOURCE_ROLE = "role"; public static final String IAM_RESOURCE_INSTANCE_PROFILE = "instance-profile"; public static final String IAM_RESOURCE_SERVER_CERTIFICATE = "server-certificate"; public static final String IAM_RESOURCE_OPENID_CONNECT_PROVIDER = "oidc-provider"; public static final String IAM_RESOURCE_ACCESS_KEY = "access-key"; public static final String IAM_RESOURCE_SIGNING_CERTIFICATE = "signing-certificate"; public static final String IAM_RESOURCE_POLICY = "policy"; // STS selected resource types public static final String STS_RESOURCE_ASSUMED_ROLE = "assumed-role"; // EC2 resource types, extension to AWS IAM public static final String EC2_RESOURCE_IMAGE = "image"; public static final String EC2_RESOURCE_SECURITYGROUP = "security-group"; public static final String EC2_RESOURCE_ADDRESS = "address"; public static final String EC2_RESOURCE_AVAILABILITYZONE = "availabilityzone"; public static final String EC2_RESOURCE_INSTANCE = "instance"; public static final String EC2_RESOURCE_KEYPAIR = "key-pair"; public static final String EC2_RESOURCE_VOLUME = "volume"; public static final String EC2_RESOURCE_SNAPSHOT = "snapshot"; public static final String EC2_RESOURCE_VMTYPE = "vmtype"; public static final String EC2_RESOURCE_TAG = "tag"; public static final String EC2_RESOURCE_PLACEMENTGROUP = "placement-group"; public static final String EC2_RESOURCE_CUSTOMERGATEWAY = "customer-gateway"; public static final String EC2_RESOURCE_DHCPOPTIONS = "dhcp-options"; public static final String EC2_RESOURCE_INTERNETGATEWAY = "internet-gateway"; public static final String EC2_RESOURCE_NETWORKACL = "network-acl"; public static final String EC2_RESOURCE_NETWORKINTERFACE = "network-interface"; public static final String EC2_RESOURCE_ROUTETABLE = "route-table"; public static final String EC2_RESOURCE_SUBNET = "subnet"; public static final String EC2_RESOURCE_VPCPEERINGCONNECTION = "vpc-peering-connection"; public static final String EC2_RESOURCE_VPC = "vpc"; public static final Set<String> EC2_RESOURCES = new ImmutableSet.Builder<String>() .add( EC2_RESOURCE_IMAGE ) .add( EC2_RESOURCE_SECURITYGROUP ) .add( EC2_RESOURCE_SECURITYGROUP.replace( "-", "" ) ) // no '-' until v4.1 .add( EC2_RESOURCE_ADDRESS ) .add( EC2_RESOURCE_AVAILABILITYZONE ) .add( EC2_RESOURCE_INSTANCE ) .add( EC2_RESOURCE_KEYPAIR ) .add( EC2_RESOURCE_KEYPAIR.replace( "-", "" ) ) // no '-' until v4.1 .add( EC2_RESOURCE_VOLUME ) .add( EC2_RESOURCE_SNAPSHOT ) .add( EC2_RESOURCE_VMTYPE ) .add( EC2_RESOURCE_TAG ) .add( EC2_RESOURCE_PLACEMENTGROUP ) .add( EC2_RESOURCE_CUSTOMERGATEWAY ) .add( EC2_RESOURCE_DHCPOPTIONS ) .add( EC2_RESOURCE_INTERNETGATEWAY ) .add( EC2_RESOURCE_NETWORKACL ) .add( EC2_RESOURCE_NETWORKINTERFACE ) .add( EC2_RESOURCE_ROUTETABLE ) .add( EC2_RESOURCE_SUBNET ) .add( EC2_RESOURCE_VPCPEERINGCONNECTION ) .add( EC2_RESOURCE_VPC ) .build(); public static final Pattern IPV4_ADDRESS_RANGE_PATTERN = Pattern.compile( "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})(?:-(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3}))?" ); public static String qualifiedName( String vendor, String name ) { return name == null ? null : vendor + ":" + name; } public static String vendor( final String qualifiedName ) { int index = qualifiedName.indexOf( ':' ); if ( index <= 0 ) { throw new IllegalArgumentException( "Name not qualified: " + qualifiedName ); } return qualifiedName.substring( 0, index ); } public static boolean isPermittedResourceVendor( final String vendor, final String resourceVendor ) { final Set<String> resourceVendors = VENDOR_RESOURCE_VENDORS.get( vendor ); return resourceVendors == null ? vendor.equals( resourceVendor ) : resourceVendors.contains( resourceVendor ); } public static String describeAction( final String vendor, final String resource ) { return "describe" + resource + "s"; } public static String canonicalizeResourceName( final String type, final String name ) { return type == null || !VENDORS_CASE_INSENSITIVE_RESOURCES.contains( vendor( type ) ) ? name : name.toLowerCase(); } }