Java Access and Permission Control

 

Motivation

Having one Security Manager is not fine scale enough for controlling access and permission.

Need a scheme that works on both local and remote access using Java.

Multiple clients need to have their own security control mechanism when access a server remotely. So, one Security Manager is not enough.

Updating Security Manager's code when a new client is added is not doable.

 

Policy

Starting from JDK 1.2, individual permissions are set using the policytool program.

Define policies under java.policy in lib/security.

Default policies such as reading java.version is set as public System properties.

Next up, .java.policy in user's home directory is examined to check for authization.

"policytool" is used to set polcies.

Turn on java debug by using:

C:\>java -Djava.security.debug=help

all           turn on all debugging
access        print all checkPermission results
combiner      SubjectDomainCombiner debugging
jar           jar verification
logincontext  login context results
policy        loading and granting
provider      security provider debugging
scl           permissions SecureClassLoader assigns

The following can be used with access:

stack     include stack trace
domain    dumps all domains in context
failure   before throwing exception, dump stack
          and domain that didn't have permission

Note: Separate multiple options with a comma

 

 

Policytool Demo

Add permission to an applet, so it could write to a file.

Start policy tool

Figure PT01

New -> Add Policy Entry

Codebase -> Enter "file:."

Add Permission

Figure PT02

Figure PT03

Done and Save

Figure PT04

Figure PT05

The policy file (mypolicy.policy) looks like:

/* AUTOMATICALLY GENERATED ON Tue Feb 11 22:37:42 PST 2003*/
/* DO NOT EDIT */

grant codeBase "file:." {
  permission java.io.FilePermission "myfile.txt", "write";
};

Java Program

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PLTester extends JApplet
{
  JTextArea jta;
  JTextField jtf;
  JButton jb;

  public void init()
  {
    jta = new JTextArea();
    jtf = new JTextField();
    jb  = new JButton ("Save");

    Container c = getContentPane();
    c.add (new JScrollPane(jta), BorderLayout.CENTER);
    c.add (jtf, BorderLayout.NORTH);
    c.add (jb,  BorderLayout.SOUTH);

    jb.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        Writer out = null;
        try
        {
          out = new BufferedWriter (new FileWriter(jtf.getText()));
          String s = jta.getText();
          out.write(s);
          JOptionPane.showMessageDialog(PLTester.this,
                                        "Save Happened");
        }
        catch (SecurityException se)
        {
          JOptionPane.showMessageDialog (PLTester.this,
                                         "Security Violation Happened",
                                         "Security Violation",
                                         JOptionPane.ERROR_MESSAGE);
        }
        catch (IOException ie)
        {
          JOptionPane.showMessageDialog(PLTester.this,
                                        "IOException Happened",
                                        "IO Problems",
                                        JOptionPane.WARNING_MESSAGE);
        }
        finally
        {
          if (out != null)
          {
            try
            {
              out.close();
            }
            catch (IOException ignored)
            {
              // Just close
            }
          }
        } // End of finally
      } // End of actionperform
    }); // End of action listener
  }  // End of init
}

 

HTML File

<applet code="PLTester" WIDTH="300" HEIGHT="200" ALT="Policy Tool"></applet>

 

The Run

java -Djava.security.policy=mypolicy.policy sun.applet.AppletViewer PLTester.htm

Security Violation when a file is saved.

Only myfile.txt can be saved.

 

Another Example with Java Application

Create another policy file that looks like the following:

/* AUTOMATICALLY GENERATED ON Wed Feb 26 22:28:07 PST 2003*/
/* DO NOT EDIT */

grant {
  permission java.util.PropertyPermission "java.io.tmpdir", "read";
};

Create a Java program that looks like:

import java.io.*;

public class GetDirName
{
  public static void main (String args[])
  {
    String dirname = System.getProperty ("java.io.tmpdir");
    System.out.println (dirname);
  }
}

Run normally:

java -Djava.security.manager GetDirName
Exception in thread "main" java.security.AccessControlException: access denied (
java.util.PropertyPermission java.io.tmpdir read)
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
        at java.lang.System.getProperty(Unknown Source)
        at GetDirName.main(GetDirName.java:7)

Run with the new policy file (sinn.policy)

java -Djava.security.policy=sinn.policy -Djava
.security.manager GetDirName
C:\DOCUME~1\sinn\LOCALS~1\Temp\