Sun ONE logo      Previous      Contents      Index      Next     

Sun ONE Web Server 6.1 Programmer's Guide

Chapter 3
Using CGI

Common Gateway Interface (CGI) programs run on the server and generate a response to return to the requesting client. CGI programs can be written in various languages, including C, C++, Java, Perl, and as shell scripts. CGI programs are invoked through URL invocation.

A wealth of information about writing CGI programs is available. A good starting point is “The Common Gateway Interface” at:

http://hoohoo.ncsa.uiuc.edu/cgi/overview.html

Sun ONE Web Server complies with the version 1.1 CGI specification.

Since the server starts up a process each time the CGI script or program runs, this is an expensive method of programming the server.

This chapter has the following sections:


Enabling CGI

Sun ONE Web Server provides two ways to identify CGI programs, which are listed below and described in this section:

Specifying CGI Directories

To specify directories that contain CGI programs (and only CGI programs) use the CGI Directory page in the Programs tab of the Class Manager. The server treats all files in these directories as CGI programs.

For each CGI directory, the file obj.conf contains a NameTrans directive that associates the name cgi with each request for a resource in that directory. These directives are automatically added to obj.conf when you specify CGI directories in the Class Manager interface, or you can manually add them to obj.conf if desired.

For example, the following instruction interprets all requests for resources in http://server-name/cgi-local as requests to invoke CGI programs in the directory C:/Sun/Servers/docs/mycgi:

NameTrans fn="pfx2dir" from="/cgi-local" dir="C:/Sun/Servers/docs/mycgi" name="cgi"

The obj.conf file must contain the following named object:

<Object name="cgi">
ObjectType fn="force-type" type="magnus-internal/cgi"
Service fn="send-cgi"
</Object>

Do not remove this object from obj.conf. If you do, the server will never recognize CGI directories, regardless of whether you specify them in the Class Manager interface or manually add more NameTrans directives to obj.conf.

Specifying CGI File Extensions

Use the CGI File Type page in the Programs tab of the Class Manager to instruct the server to treat all files with certain extensions as CGI programs, regardless of which directory they reside in. The default CGI extensions are .cgi, .bat, and.exe.

To change which extensions indicate CGI programs, modify the following line in the mime.types file to specify the desired extensions. Be sure to restart the server after editing mime.types.

type=magnus-internal/cgi exts=cgi,exe,bat

When the server is enabled to treat all files with an appropriate extensions as CGI programs, the obj.conf file contains the following Service directive:

Service fn="send-cgi" type="magnus-internal/cgi"


Creating Custom Execution Environments for CGI Programs (UNIX only)

Before you can create a custom execution environment, you must install the suid Cgistub and run it as root:

  1. Log in as the superuser.
  2. su

  3. Create the private directory for Cgistub:
  4. cd server_root/https-instance

    mkdir private

  5. Copy Cgistub to the private directory:
  6. cd private

    cp ../../bin/https/bin/Cgistub .

  7. Set the owner of private to the server user:
  8. chown user .

  9. Set the permissions on private:
  10. chmod 500 .

  11. Set the owner of Cgistub to root:
  12. chown root Cgistub

  13. Set the permissions on Cgistub:
  14. chmod 4711 Cgistub

  15. You can give each reference to the send-cgi SAF in obj.conf a user parameter. For example:
  16. Service fn="send-cgi" user="user"

    You can use variable substitution. For example, in server.xml, give a VS (virtual server) element the following VARS subelement:

    <VARS user="user"/>

    This lets you write the send-cgi SAF line in obj.conf as follows:

    Service fn="send-cgi" user="$user"

    For more information about send-cgi in the obj.conf file and server.xml, see the Sun ONE Web Server 6.1 Administrator’s Configuration File Reference.

  17. Restart the server to put the changes into effect.

  18. Note

    Installing Cgistub in the server_root/https-instance/private directory is recommended. If you install it anywhere else, you must specify the path to Cgistub in the init-cgi function in magnus.conf. For details, see the Sun ONE Web Server 6.1 NSAPI Programmer’s Guide.



    Note

    It may not be possible to install the suid Cgistub program on an NFS mount. If you wish to use an suid Cgistub, you must install your server instance to a local file system.


Cgistub enforces the following security restrictions:

After you have installed Cgistub you can create custom execution environments by doing the following, as described in this section:

Specifying a Unique CGI Directory and UNIX User and Group for a Virtual Server

To prevent a virtual server’s CGI programs from interfering with other users, these programs should be stored in a unique directory and execute with the permissions of a unique UNIX user and group.

First, create the UNIX user and group. The exact steps required to create a user and group vary by operating system. For instructions, consult your operating system's documentation.

Next, follow these steps to create a cgi-bin directory for the virtual server:

  1. Log in as the superuser.
  2. su

  3. Change to the virtual server directory.
  4. cd vs_dir

  5. Create the cgi-bin directory.
  6. mkdir cgi-bin

    chown user:group cgi-bin

    chmod 755 cgi-bin

Now you can set the virtual server’s CGI directory, user, and group in one of these ways:

Specifying a Chroot Directory for a Virtual Server

To further improve security, these CGI scripts should be prevented from accessing data above and outside of the virtual server directory.

First, set up the chroot environment. The exact steps required to set up the chroot environment vary by operating system. For instructions, consult your operating system’s documentation. The man pages for ftpd and chroot are often a good place to start.

These are the steps required for Solaris versions 2.6 through 8:

  1. Log in as the superuser.
  2. su

  3. Change to the chroot directory. This is typically the vs_dir directory mentioned in the previous section.
  4. cd chroot

  5. Create tmp in the chroot directory:
  6. mkdir tmp

    chmod 1777 tmp

  7. Create dev in the chroot directory:
  8. mkdir dev

    chmod 755 dev

  9. List /dev/tcp, and note the major and minor numbers of the resulting output. In this example, the major number is 11 and the minor number is 42:
  10. ls -lL /dev/tcp

    crw-rw-rw- 1 root sys 11, 42 Apr 9 1998 /dev/tcp

  11. Create the tcp device using the major and minor numbers:
  12. mknod dev/tcp c 11 42

    chmod 666 dev/tcp

  13. Repeat steps 5 and 6 for each of the following devices (each device will have a different major and minor combination):
  14. /dev/udp
    /dev/ip
    /dev/kmem
    /dev/kstat
    /dev/ksyms
    /dev/mem
    /dev/null
    /dev/stderr
    /dev/stdin
    /dev/stdout
    /dev/ticotsord
    /dev/zero

  15. Set permissions on the devices in dev in the chroot directory:
  16. chmod 666 dev/*

  17. Create and populate lib and usr/lib in the chroot directory:
  18. mkdir usr

    mkdir usr/lib

    ln -s /usr/lib

    ln /usr/lib/* usr/lib

    You can ignore the messages this command generates.

    If the /usr/lib directory is on a different file system, replace the last command with the following:

    cp -rf /usr/lib/* usr/lib

  19. Create and populate bin and usr/bin in the chroot directory:
  20. mkdir usr/bin

    ln -s /usr/bin

    ln /usr/bin/* usr/bin

    You can ignore the messages this command generates.

    If the /usr/bin directory is on a different file system, replace the last command with the following:

    cp -rf /usr/bin/* usr/bin

  21. Create and populate etc in the chroot directory:
  22. mkdir etc

    ln /etc/passwd /etc/group /etc/netconfig etc

  23. Test the chroot environment:
  24. chroot chroot bin/ls -l

    The output should look something like this:

      total 14
      lrwxrwxrwx        1 root      other      8 Jan 13 03:32 bin -> /usr/bin
      drwxr-xr-x        2 user      group      512 Jan 13 03:42 cgi-bin
      drwxr-xr-x        2 root      other      512 Jan 13 03:28 dev
      drwxr-xr-x        2 user      group      512 Jan 13 03:26 docs
      drwxr-xr-x        2 root      other      512 Jan 13 03:33 etc
      lrwxrwxrwx        1 root      other      8 Jan 13 03:30 lib -> /usr/lib
      drwxr-xr-x        4 root      other      512 Jan 13 03:32 usr

Now you can set the virtual server’s chroot directory in one of these ways:


Adding CGI Programs to the Server

To add CGI programs to Sun ONE Web Server, just do one of the following:

For UNIX, make sure the program file has execute permissions set.


Setting the Priority of a CGI Program

The priority of a CGI program can be set using the nice parameter of the send-cgi function. This is a UNIX-only parameter and accepts an increment that determines the CGI program’s priority relative to the server. Typically, the server is run with a nice value of 0 and the nice increment would be between 0 (the CGI program runs at same priority as server) and 19 (the CGI program runs at much lower priority than server). As with all other CGI variables, this can be configured per class or per virtual server.

For more information about send-cgi, see the Sun ONE Web Server 6.1 Administrator’s Configuration File Reference.

To configure CGI variables for a class:

All virtual servers in the specified class will inherit the value from the class. This can be overridden by setting the value for an individual virtual server, as described below.

To configure CGI variables for a virtual server:

  1. Access the Class Manager, and then click Manage Virtual Servers on the Virtual Servers tab.
  2. Select a virtual server, click Manage, and then click Settings.
  3. Specify the nice value as desired, and then click OK and apply your changes.

The value overrides any value set at the class level.


Windows CGI and Shell CGI Programs

For information about installing CGI and shell CGI programs on Windows using the Class Manager interface, see the Sun ONE Web Server 6.1 Administrator’s Guide.


Perl CGI Programs

You cannot run CGIs using Perl 5.6.x with the -w flag. Instead, include the following code in the file:

use warnings;


Global CGI Settings

To change global CGI settings:

  1. Access the Server Manager, and click the Magnus Editor page.
  2. Select CGI Settings from the drop-down list, and then click Manage.
  3. In the Magnus Editor, specify values for the following settings:
    • MinCGIStubs. Controls the number of processes that are started by default. Note that if you have an init-cgi directive in the magnus.conf file, the minimum number of CGIStub processes are spawned at startup. The value must be less than the MaxCGIStubs value.
    • CGIExpirationTimeout. Specifies the maximum time in seconds that CGI processes are allowed to run before being killed.
    • CGIStubIdleTimeout. Causes the server to kill any CGIStub processes that have been idle for the number of seconds set by this directive. Once the number of processes is at MinCGIStubs, the server does not kill any more processes.
    • MaxCGIStubs. Controls the maximum number of CGIStub processes the server can spawn. This is the maximum concurrent CGIStub processes in execution, not the maximum number of pending requests.
  4. Click OK and apply your changes.

For more information about these global CGI settings, see the description of the magnus.conf file in the Sun ONE Web Server 6.1 Administrator's Configuration File Reference.


CGI Variables

In addition to the standard CGI variables, you can use the Sun ONE Web Server CGI variables in CGI programs to access information about the client certificate if the server is running in secure mode. The CLIENT_CERT and REVOCATION variables are available only when client certificate-based authentication is enabled.

The following table lists the Sun ONE Web Server CGI variables. The left column lists the variable, and the right column provides a description.

Table 3-1  CGI Variables

Variable

Description

SERVER_URL

URL of the server that the client requested

HTTP_xxx

An incoming HTTP request header, where xxx is the name of the header

HTTPS

ON if the server is in secure mode, otherwise OFF

HTTPS_KEYSIZE

Keysize of the SSL handshake (available if the server is in secure mode)

HTTPS_SECRETKEYSIZE

Keysize of the secret part of the SSL handshake (available if the server is in secure mode)

HTTPS_SESSIONID

Session ID for the connection (available if the server is in secure mode)

CLIENT_CERT

Certificate the client provided (binary DER format)

CLIENT_CERT_SUBJECT_DN

Distinguished Name of the subject of the client certificate

CLIENT_CERT_SUBJECT_OU

Organization Unit of the subject of the client certificate

CLIENT_CERT_SUBJECT_O

Organization of the subject of the client certificate

CLIENT_CERT_SUBJECT_C

Country of the subject of the client certificate

CLIENT_CERT_SUBJECT_L

Location of the subject of the client certificate

CLIENT_CERT_SUBJECT_ST

State of the subject of the client certificate

CLIENT_CERT_SUBJECT_E

E-mail of the subject of the client certificate

CLIENT_CERT_SUBJECT_UID

UID part of the CN of the subject of the client certificate

CLIENT_CERT_ISSUER_DN

Distinguished Name of the issuer of the client certificate

CLIENT_CERT_ISSUER_OU

Organization Unit of the issuer of the client certificate

CLIENT_CERT_ISSUER_O

Organization of the issuer of the client certificate

CLIENT_CERT_ISSUER_C

Country of the issuer of the client certificate

CLIENT_CERT_ISSUER_L

Location of the issuer of the client certificate

CLIENT_CERT_ISSUER_ST

State of the issuer of the client certificate

CLIENT_CERT_ISSUER_E

E-mail of the issuer of the client certificate

CLIENT_CERT_ISSUER_UID

UID part of the CN of the issuer of the client certificate

CLIENT_CERT_VALIDITY_START

Start date of the certificate

CLIENT_CERT_VALIDITY_EXIRES

Expiration date of the certificate

CLIENT_CERT_EXTENSION_xxx

Certificate extension, where xxx is the name of the extension

REVOCATION_METHOD

Name of the certificate revocation method if it exists

REVOCATION_STATUS

Status of certificate revocation if it exists



Previous      Contents      Index      Next     


Copyright 2003 Sun Microsystems, Inc. All rights reserved.