Controlling SPD Server Resources with PROC SPDO and ACL Commands

Using PROC SPDO

Overview of PROC SPDO

PROC SPDO is the SAS procedure for the SPD Server operator interface.
PROC SPDO runs only on systems where the SAS is installed.

PROC SPDO Command Set

To invoke PROC SPDO, submit:
PROC SPDO LIB=libref ;
where libref is a LIBNAME that was previously allocated to the sasspds engine.
Currently there are two classes of PROC SPDO commands:
  • ACL commands
  • LIBNAME proxy commands
The ACL commands are described below with some simple examples that demonstrate their syntax and usage. More information about LIBNAME Proxy Commands is available in SPD Server Operator Interface Procedure (PROC SPDO) .

Using ACL

An SPD Server Access Control List ( ACL) permits three distinct levels of permission on a resource. First, you can grant UNIVERSAL permissions to SPD Server users who are not in the same ACL group as the resource owner. Second, you can grant GROUP permissions to SPD Server users who are in the same ACL group as the resource owner. Third, you can grant USER permissions to a specific SPD Server user ID. The precedence of permission checks is as follows:
  1. Check user-specific permissions first. If defined, the accessor gets these permissions.
  2. If a resource is owned by the same ACL group as the accessor, the accessor gets the resource's GROUP permissions.
  3. If the resource is owned by a different ACL group than the accessor, the accessor gets the resource's UNIVERSAL permissions.
To turn on LIBACLINHERIT permissions in your spdsserv.parm file, submit the statement:
LIBACLINHERIT ; . 
To turn off LIBACLINHERIT permissions in your spdsserv.parm file, submit the statement::
NOLIBACLINHERIT ; .
You can also use your libnames.parm file to turn on LIBACLINHERIT permissions.
To turn on LIBACLINHERIT permissions in your libnames.parm file, submit the statement:
LIBACLINHERIT=YES.
To turn off LIBACLINHERIT permissions in your libnames.parm file, submit the statement::
LIBACLINHERIT=NO.
If the LIBACLINHERIT parameter file option is turned on, the ACL precedence of permission checks changes. Turning on LIBACLINHERIT creates a LIBNAME ACL on the specified LIBNAME domain. The LIBNAME ACL grants users rights to all resources within the LIBNAME domain. When a LIBNAME ACL is created for a specified LIBNAME domain, the ACL precedence of permission checks becomes:
  1. Check user-specific permissions first. If defined, the accessor gets these permissions.
  2. If a resource is owned by the same ACL group as the accessor, the accessor gets the resource's GROUP permissions.
  3. LIBNAME ACL permissions are used for domains where LIBACLINHERIT is turned on.
  4. If the resource is owned by a different ACL group than the accessor, the accessor gets the resource's UNIVERSAL permissions.

ACL Concepts

ACL Groups

ACL groups are somewhat analogous to UNIX groups. Each SPD Server user ID can belong to one or more ACL groups.
The SPD Server administrator can affiliate a given SPD Server user ID with up to five ACL groups. When you connect to an SPD Server using a LIBNAME assignment, you assert a specific ACL group using the ACLGRP= option.
The ACLGRP= value in your LIBNAME assignment must match one of the five groups that the administrator defined for you. If you do not assert ACLGRP= in your LIBNAME assignment, the SPD Server affiliates you with your default ACL group. (This is the first group in the list of five.)
When defining user-specific ACL permissions, you can use an ACL group wherever you can use an explicit SPD Server user ACL. Using an ACL group grants privileges to the ACL group instead of only to a specific SPD Server user.

Column Security

SPD Server allows you to control access to table contents at the column level through the use of ACLs. Column security ACLs can be applied to individual users at the user level, or applied to collections of users at the group level. SPD Server enforces precedence for user and group ACL permissions: first user ACL permissions are applied, then group ACL restrictions are applied. SPD Server user permissions override SPD Server group permissions.
When you use an ACL statement to create a protected column in a table, all individual users or groups are automatically denied access to the protected column until they are explicitly granted ACL permission to access it. When you issue an ACL statement to grant or deny the contents of a table column to a single user or user group, the protected column automatically becomes unavailable to all individual users and user groups, unless they are specifically given access to the protected column.
Examine a scenario where a testing department hires a new member, Joe. Joe has applied for classified security clearance, but his security clearance level will not be certified for several weeks. All members of the department use an SPD Server table TESTING that contains a column of classified information. Joe needs access to all of the TESTING table except the protected column, and the rest of his group needs access to the whole TESTING table.
First, you submit a user-level ACL statement to restrict the secure column in table TESTING from Joe. Joe is explicitly denied access, but since the column is now a protected entity, all other TESTING table users are also denied access to the column by default. Once a column is protected via ACL security, explicit permissions must be granted in order for any user (or groups of users) to be able to access the column content. Instead of issuing user-level column ACL permissions to the rest of the testing group individually, you issue a group-level ACL column permission to the user group TESTGROUP that explicitly grants access to the protected column.
SPD Server reads the user-level ACL permissions first, and gives Joe access to the table TESTGROUP, but restricts him from the secure column. Then SPD Server reads the group ACL permissions, and grants all of the TESTGROUP members access to the full table, including the secure column. Joe is a member of TESTGROUP, but the user-level ACL permissions maintain precedence over group-level ACL permissions. This results in all of TESTGROUP having full table access, except Joe. Joe's user-level ACL column security restriction prevents him from accessing the classified column.
Now consider another scenario, where John manages a group DEVGROUP whose members record their billable project hours and codes in an SPD Server table. In that table, manager John keeps billing rate information based on employee salaries in a protected column RATE. Only John should be able to see the entire table, and the rest of the DEVGROUP should be able to see the table minus the RATE column. In this case, you create column security by protecting the RATE column with a user-level ACL permission statement for John. The DEVGROUP members can have full table permissions at the group level, but will not see the protected column because John's user-level column security ACLs will override any group-level ACLs for the DEVGROUP table.

Generic ACL

You can use generic ACL names for a class of resources that have a common prefix. You can use the asterisk symbol "*" as a wildcard. This permits you to make a single ACL entry instead of making explicit entries for each resource. For example, if you have tables named SALESNE, SALESSE, SALESMW, SALESSW, SALESPW, and SALESNW, you could use the wildcard symbol to create the generic ACL name, SALES*, to cover them all. You then would define your ACL permissions on the SALES* generic ACL.
When using PROC SPDO, use the /GENERIC command option to identify a generic ACL.
Note: If you specify /GENERIC when defining a table column ACL, the /GENERIC applies to the table name, not to the column name. You cannot use wildcards with column names.

LIBNAME ACL

You can control access permissions to an entire LIBNAME domain with the SPD Server ACL facility. When using PROC SPDO, use the /LIBNAME option to identify the LIBNAME domain ACL.

Persistent ACL

A persistent ACL entry is an ACL that is not removed from the ACL tables when the resource itself is deleted. When using PROC SPDO, use the /PERSIST command option to identify a persistent ACL.

Resource

A PROC SPDO resource is
  • a table (data set)
  • a table column (data set variable)
  • a catalog
  • a catalog entry
  • a utility file (for example, a VIEW, an MDDB, and so on)
  • a LIBNAME domain.

Two-Part Resource Name

Two-part names identify a column entry within a table. Use the normal SAS convention of table.column when specifying the table and column that you want to secure.
When issuing SPDO commands, you can use two-part names in any context that defines, modifies, lists, or deletes table-related ACLs. You can also specify the reserved word _ALL_ as the column name when using SPDO commands that support the _ALL_ resource name.

Giving Control to Others

You permit other SPD Server users to alter your own ACL entry by granting a specific user/group ACL entry. See MODIFY ACL and MODIFY ACL _ALL_ for more information about user-specific ACL entries.

Overview of the ACL Command Set

This section describes PROC SPDO commands that you use to create and maintain ACLs on SPD Server resources.
To perform an ACL-related command, you must first assert an ACL user ID to define the scope of your access. In addition, you might want to set up a scoping member type to access ACLs for resource types other than DATA. Then you can ADD, MODIFY, LIST, or DELETE ACLs within the scope that you set up. You can switch the scope of a user and/or member type at any point in a command sequence, and then continue with additional ACL commands in the new scope.

SET ACLTYPE memtype;

Sets the member type for subsequent ACL operations. Valid values are DATA, CATALOG, VIEW, and MDDB. The default is DATA.

SET ACLUSER [name];

Sets the SPD Server user scope for subsequent ACL operations. The user scope restricts your view to only those ACL records that have the specified user name as the owner of the ACL entry. If name is omitted, the default is the user who assigns the libref.
To actually perform an ACL operation on a resource entry, you must
  • be the ACL entry owner, or
  • have CONTROL access over the ACL entry, or
  • have ACLSPECIAL=YES enabled on your PROC SPDO LIBNAME connection.
Note: You must first issue a SET ACLUSER command before issuing any of the following ACL commands.

ADD ACL acl1 acl2... [C=cat T=type] [/options]

Creates new ACL entries acl1 acl2... where ACL entries acl1 acl2 ... can be one-part resource names or two-part table column names.
Add ACL Options
READ
Grants universal READ access to the resource.
WRITE
Grants universal WRITE access to the resource.
ALTER
Grants universal ALTER access to the resource.
GROUPREAD
Grants group READ access to the resource.
GROUPWRITE
Grants group WRITE access to the resource.
GROUPALTER
Grants group ALTER access to the resource.
GENERIC
Specifies that acl1 acl2... are generic ACLs.
PERSIST
Specifies that acl1 acl2... are persistent ACLs.
LIBNAME
Identifies the special LIBNAME domain resource.
MODEL=acl-name
Specifies the name of another ACL. This option requests the software to copy all the access permissions and access list entries from this ACL.
C=cat
Identifies the specified ACL names acl1 acl2... as the names of catalog entries in the catalog cat. You pair this value with the T= option.
T=type
Identifies the catalog entry type to associate with the specified ACLs acl1 acl2... when you specify the C=cat option.

ADD ACL Examples

Add LIBNAME Domain ACL

This ACL grants universal READ and group WRITE access.
     add acl/LIBNAME
        read
        groupwrite;

Add Resource ACL

This ACL for the resource MINE_JAN1999 grants universal READ and WRITE access.
add acl mine_jan1999/read write;

Add Generic ACL

This generic ACL for MINE* grants universal READ access.
add acl mine/generic read;

Add Column ACL

This ACL for the column MINE_JAN2006.SALARY grants group READ access and denies access to all others.
add acl mine_jan2006.salary/groupread;

Add Generic Column ACL

This ACL for the column MINE*.SALARY grants group READ access and denies access to all others.
     add acl mine.salary/generic
        groupread;

Add Catalog ACL

This ACL for the MYCAT catalog grants universal READ and group READ/WRITE access.
     set acltype catalog;
     add acl mycat/read
      groupread
      groupwrite;
 

Add Generic ACL for Catalog Entries

This ACL for catalog entries, MYCAT.MY*.CATAMS, grants universal READ and group READ access.
    set acltype catalog;
     add acl my
      c=mycat
      t=catams/generic
      read
      groupread;

MODIFY ACL and MODIFY ACL _ALL_

MODIFY ACL acl1 acl2... [C=cat T=type] /options user list;

MODIFY ACL _ALL_ /options user list;

Modifies existing ACLs for resources acl1 acl2... where ACL entries acl1 acl2... can be one-part resource names or two-part table column names. Specifying _ALL_ modifies all existing ACLs for which you have control access. Specifying _ALL_ as the table identifier in a two-part name modifies all tables for which the given column is matched. Specifying _ALL_ as the column identifier in a two-part name modifies all columns for which the given table is matched. The characteristics modified are specified by options and/or user list.
Modify ACL Options
READ
Grants universal READ access.
NOREAD
Removes universal READ access.
WRITE
Grants universal WRITE access.
NOWRITE
Removes universal WRITE access.
ALTER
Grants universal ALTER access.
NOALTER
Removes universal ALTER access.
GROUPREAD
Grants group READ access.
NOGROUPREAD
Removes group READ access.
GROUPWRITE
Grants group WRITE access.
NOGROUPWRITE
Removes group WRITE access.
GROUPALTER
Grants group ALTER access.
NOGROUPALTER
Removes group ALTER access.
GENERIC
Specifies that acl1 acl2... are generic ACLs.
LIBNAME
Identifies the special LIBNAME domain ACL.
C=cat
Identifies the selected ACLs as names of catalog entries from the catalog cat. This value must be paired with the T= option.
T=type
Identifies the catalog entry type used to qualify the selected ACLs when the C=cat option is specified.
userlist
can be user name = (Y/N,Y/N,Y/N,Y/N) for (READ,WRITE,ALTER,CONTROL).

MODIFY ACL Examples

Modify LIBNAME Domain ACL

This modifies a LIBNAME domain to set READ and WRITE access for a given user.
modify acl/LIBNAME
  ralph=(y,y,n,n);

Modify ACL MINE

This modifies ACL MINE_JAN2003 to deny universal WRITE access and add user-specific permissions.
     modify acl mine_jan2003/nowrite
       bolick=(y,n,n,n)
       johndoe=(n,n,n,n);

Modify Generic ACL

This modifies a generic ACL MINE* to add user-specific permissions.
modify acl mine/generic
  tom=(y,y,y,n); 

Modify All ACLs

This modifies all ACLs to grant READ access to a given user.
modify acl _all_/gene=(y,,,);

Modify Column ACL

This modifies column ACL, MINE_JAN2006.SALARY, to add explicit READ and WRITE access for a given user.
modify acl mine_jan2006.salary/ralph=(y,y,n,n);

Modify Generic Column ACL

This modifies generic column ACL, MINE*.SALARY, to add explicit READ and WRITE access for a given user.
modify acl mine.salary/generic
 debby=(y,y,n,n);

Modify ACL for a Catalog

This modifies catalog MYCAT to remove universal READ and group WRITE access.
set acltype catalog;
  modify acl mycat/noread nogroupwrite;

Modify Generic ACL for Catalog Entries

This modifies a generic ACL for catalog entries, MYCAT.MY*.CATAMS, to remove universal READ access.
     set acltype catalog;
      modify acl my
       c=mycat
       t=catams/generic noread;

LIST ACL and LIST ACL _ALL_

LIST ACL acl1 acl2... [/options];

LIST ACL _ALL_ [/options];

Lists information about specific ACLs acl1 acl2... where ACL entries acl1 acl2... can be one-part resource names or two-part (table.column) names. Specifying _ALL_ lists all existing resource ACLs for which you have control access. Specifying _ALL_ as the table identifier in a two-part name lists all tables for which the given column is matched. Specifying _ALL_ as the column identifier in a two-part name lists all columns for which the given table is matched.
List ACL Options:
GENERIC
Specifies that acl1 acl2 are generic ACLs.
LIBNAME
Identifies the special LIBNAME domain ACL.
C=cat
Identifies the selected ACLs as names of catalog entries from the catalog cat. This value must be paired with the T= option.
T=type
Identifies the catalog entry type used to qualify the selected ACLs when the C=cat option is specified.
VERBOSE
Performs the requested table ACL listing, followed by the column ACLs for a specified table(s). This is equivalent to a LIST ACL table followed by a LIST ACL table._ALL_.

LIST ACL Examples

List All ACL Entries

This lists all ACL entries for the current ACL type setting.
list acl _all_;

List a Generic ACL

This lists a generic ACL entry for MINE*.
list acl mine/generic;

List All Column ACLS for a Table

This lists all column ACLs for table MINE_JAN2003.
list acl mine_jan2003._all_;

List All Column ACLs for All Tables

This lists all column ACLs for all tables.
list acl _all._all_;

List a Specific Column

This lists the column ACL for MINE_JAN2006.SALARY.
list acl
 mine_jan2006.salary;

List All ACL Data for a Table

This provides all ACL information for table MINE_JAN2006.
list acl
 mine_jan2006/verbose;

List All ACLs for Catalogs

This lists all ACLs for the ACL type 'catalog'.
set acltype catalog;
 list acl _all_;

List All ACLs for a Catalog

This lists all ACLs for catalog MYCAT.?.CATAMS.]
set acltype catalog;

  list acl _all_ c=mycat t=catams;

DELETE ACL and DELETE ACL _ALL_

DELETE ACL acl1 acl2... [C=cat T=type] /options

DELETE _ALL_[C=cat T=type] /options;

Deletes existing ACLs for resources acl1 acl2... where ACL entries acl1 acl2... can be one-part resource names or two-part table.column names. Specifying _ALL_ deletes all existing resource ACLs for which you have control access. Specifying _ALL_ as the table identifier in a two-part name deletes all tables for which the given column is matched. Specifying _ALL_ as the column identifier in a two-part name deletes all columns for which the given table is matched.
Delete ACL Options:
GENERIC
Specifies that acl1 acl2 are generic ACLs.
LIBNAME
Identifies the special *LIBNAM* ACL.
C=cat
Identifies the selected ACLs as names of catalog entries from the catalog cat. This value must be paired with the T= option.
T=type
Identifies the catalog entry type used to qualify the selected ACLs when the C=cat option is specified.

DELETE ACL Examples

Delete a LIBNAME ACL

This deletes a LIBNAME ACL.
delete acl/LIBNAME;

Delete All ACLs for Current ACL Type

This deletes all the ACLs for the current ACL type.
delete acl _all_;

Delete a Resource ACL

This deletes ACL MINE_JAN2003.
delete acl mine_jan2003;

Delete a Generic ACL

This deletes a generic ACL MINE*.
delete acl mine/generic;

Delete a Column ACL

This deletes a column ACL on MINE_JAN2003.SALARY.
delete acl mine_jan2003.salary;

Delete All Column ACLs on a Table

This deletes all column ACLs on table KBIKE.
delete acl kbike._all_;

Delete All Column ACLs on All Tables

This deletes all column ACLs on all tables.
delete acl _all_._all_;

Delete a Catalog ACL

This deletes an ACL on the catalog RBIKE.
set acltype catalog;
 delete acl rbike;

Delete a Generic ACL on Catalog Entries

This deletes a generic ACL on the catalog entries MYCAT.MY*.CATAMS.
set acltype catalog;
delete acl my
 c=mycat
 t=catams/generic;