blob: ea6d9b422d15190ec1539d32198b357b60a38c45 [file] [log] [blame]
#!/bin/bash
# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@
#==============================================================================
# script: traf_authentication_setup
#
# This script is run to setup authentication for Trafodion.
# You can turn on authentication, turn off authentication, or get the status
# It is off by default when the software is installed
#
# To turn on authentication, specify:
# --setup or --on
# --file <name> (OPTIONAL)
# ==> specifies the name of the ldap configuration file that
# will be used to contact the identity store
# defaults to: $TRAF_HOME/sql/script/.traf_authentication_config
#
# When specifying --setup or --on, the script:
# ==> verifies that the configuration file exists
# ==> calls ldapconfigcheck to verify the contents of the config file
# ==> calls ldapcheck to test a connection to LDAP
# ==> if all is good then:
# ==> sets the environment variable TRAFODION_ENABLE_AUTHENTICATION to
# YES in $TRAF_HOME/sqenvcom.sh
# ==> copies $TRAF_HOME/sqenvcom.sh to all nodes in cluster
# ==> propagates $TRAF_HOME/sql/script/.traf_authentication_config to
# all nodes in the cluster
#
# When specifying --on
# ==> brings up sqlci and performs "initialize authorization"
#
# To turn off authentication specify:
# --off
#
# When specifying --off, the script:
# ==> sets the environment variable TRAFODION_ENABLE_AUTHENTICATION = YES
# in $TRAF_HOME/sqenvcom.sh
# ==> copies $TRAF_HOME/sqenvcom.sh to all nodes in cluster
#
# To know whether authentication is enable or not, specify:
# -- status
#
# When specifying --status, the script returns the value of:
# TRAFODION_ENABLE_AUTHENTICATION
#===============================================================================
function print_usage {
cat << EOF
This script enables or disables security features for Trafodion
Usage: $(basename $0) [options]
Options:
--file <loc> Optional location of OpenLDAP configuration file
--help Prints this message
--off Disables authentication and authorization
--on Enables authentication and authorization
--setup Enables authentication
--status Returns status of authentication enablement
EOF
}
# =============================================================================
# function: change_sqenvcom
#
# This function adjusts the sqenvcom file by changing the envvar:
# TRAFODION_ENABLE_AUTHENTICATION to either YES (--on) or NO (--off)
# =============================================================================
function change_sqenvcom
{
echo "INFO: Modifying sqenvcom.sh to adjust the authentication default"
cp $TRAF_HOME/sqenvcom.sh sqenvcom.sh_temp
if [ $authOn -eq 1 ]; then
sed -e 's@TRAFODION_ENABLE_AUTHENTICATION=.*$@TRAFODION_ENABLE_AUTHENTICATION=YES@' <sqenvcom.sh_temp >$TRAF_HOME/sqenvcom.sh
echo "INFO: Authentication has been enabled"
else
sed -e 's@TRAFODION_ENABLE_AUTHENTICATION.*$@TRAFODION_ENABLE_AUTHENTICATION=NO@' <sqenvcom.sh_temp >$TRAF_HOME/sqenvcom.sh
echo "INFO: Authentication has been disabled"
fi
rm sqenvcom.sh_temp > /dev/null 2>&1
if [ $isCluster -eq 1 ]; then
#echo "pdcp -p -x $HOSTNAME $MY_NODES $TRAF_HOME/sqenvcom.sh $TRAF_HOME"
pdcp -p -x $HOSTNAME $MY_NODES $TRAF_HOME/sqenvcom.sh $TRAF_HOME
fi
}
# =============================================================================
# function setup_config
#
# This function determines the configuration file name and makes sure the
# configuration file is valid
# =============================================================================
function setup_config
{
# Check to see if the passed in name is a directory, if so then
# attach the configuration file name to create a complete location
if [ -d $configFile ]; then
configFile=$configFile$defaultConfigFile
fi
# Does the configuration file exist?
if [ ! -s $configFile ]; then
echo
echo "ERROR: Configuration file $configFile does not exist."
echo
exit 1;
fi
echo "INFO: Using configuration file $configFile"
# make sure the configuration file is valid
ldapconfigcheck -file $configFile > auth_configcheck
isValid=`/bin/cat auth_configcheck | grep -e "is valid" | wc -l`
if [ $isValid -ne 1 ]; then
echo
echo "***ERROR: Configuration file is invalid, check file params"
cat auth_configcheck
echo
exit 2
fi
rm auth_configcheck
echo "INFO: Configuration file is valid"
}
# =============================================================================
# function copy_config
#
# This function makes sure the configuration file can be used to contact LDAP
# then it copies the configuration file to all the nodes in the cluster
# =============================================================================
function copy_config
{
if [ "$configFile" != "$defaultConfigFileDir$defaultConfigFile" ]; then
cp $configFile $defaultConfigFileDir$defaultConfigFile
fi
# before propagating the configuration file to nodes in the cluster, verify
# that the current file can successfully contact the identity store
ldapcheck --username=micky.mouse > auth_configcheck
isValid=`cat auth_configcheck | grep "(Invalid username or password)" | wc -l`
if [ $isValid -ne 1 ]; then
echo
echo "***ERROR: Configuration file is invalid, error contacting LDAP server"
cat auth_configcheck
echo
exit 2
fi
rm auth_configcheck
# copy the configuration file to $TRAF_HOME/sql/scripts on
# all nodes in the cluster
if [ $isCluster -eq 1 ]; then
#echo "pdcp -p -x $HOSTNAME $MY_NODES $configFile $defaultConfigFileDir$defaultConfigFile"
pdcp -p -x $HOSTNAME $MY_NODES $configFile $defaultConfigFileDir$defaultConfigFile
fi
echo "INFO: Configuration file has been propagated to nodes in the cluster"
}
# =============================================================================
# function enable_authorization
#
# this functions calls sqlci to enable authorization
# =============================================================================
function enable_authorization
{
logLoc=$TRAF_HOME/logs
rm $logLoc/authEnable.log > /dev/null 2>&1
#gdb sqlci
sqlci >> "$logLoc/authEnable.log" 2>&1 <<eof
values (current_timestamp);
initialize authorization;
get tables in schema privmgr_md;
get users;
get roles;
get components;
exit;
eof
errorRows=`/bin/cat $logLoc/authEnable.log | /bin/grep "\*\*\* ERROR" | wc -l`
if [ $errorRows -ne 0 ]; then
echo "ERROR: Authorization setting have not changed, see $logLoc/authEnable.log"
else
echo "INFO: Authorization (grant/revoke support) has been enabled"
fi
}
# =============================================================================
# function disable_authorization
#
# this functions calls sqlci to disable authorization
# =============================================================================
function disable_authorization
{
logLoc=$TRAF_HOME/logs
rm $logLoc/authDisable.log > /dev/null 2>&1
sqlci >> "$logLoc/authDisable.log" 2>&1 <<eof
values (current_timestamp);
initialize authorization, drop;
get tables in schema privmgr_md;
get users;
get roles;
exit;
eof
errorRows=`/bin/cat $logLoc/authDisable.log | /bin/grep "\*\*\* ERROR" | wc -l`
if [ $errorRows -ne 0 ]; then
echo "ERROR: Authorization settings have not changed, see $logLoc/authDisable.log"
else
echo "INFO: Authorization (grant/revoke support) has been disabled"
fi
}
# =============================================================================
# function status_authorization
#
# this functions calls sqlci to see if the schema containing authorization
# data exists (PRIVMGR_MD)
# =============================================================================
function status_authorization
{
logLoc=$TRAF_HOME/logs
rm $logLoc/authStatus.log > /dev/null 2>&1
sqlci >> "$logLoc/authStatus.log" 2>&1 <<eof
values (current_timestamp);
get schemas, no header;
exit;
eof
errorRows=`/bin/cat $logLoc/authStatus.log | /bin/grep "\*\*\* ERROR" | wc -l`
if [ $errorRows -ne 0 ]; then
echo " Unable to determine authorization status, see $logLoc/authStatus.log"
else
privMgrSchema=`/bin/cat $logLoc/authStatus.log | /bin/grep "PRIVMGR_MD" | wc -l`
if [ $privMgrSchema -eq 0 ]; then
echo " Authorization (grant/revoke) is NOT ENABLED"
else
echo " Authorization (grant/revoke) is ENABLED"
fi
fi
}
# =============================================================================
# main
# =============================================================================
defaultConfigFileDir="$TRAF_HOME/sql/scripts"
defaultConfigFile="/.traf_authentication_config"
configFileDir=$defaultConfigFileDir
configFile=$defaultConfigFileDir$defaultConfigFile
authOn=0
authOnSpecified=0
enableAuthorization=0
authOff=0
authOffSpecified=0
fileSpecified=0
doStatus=0
statusSpecified=0
# Make sure required env vars have been set first
if [[ -z "$TRAF_HOME" ]]; then
echo
echo "***ERROR: Environment variable TRAF_HOME has no value."
echo
exit 1
fi
# Parse input parameters
while [[ $# -gt 0 ]]; do
case "$1" in
-f | --file)
if [[ -z "$2" ]]; then
echo
echo "***ERROR: No filename specified for param $1."
print_usage
exit 1
fi
if [ $fileSpecified -eq 1 ]; then
echo
echo "***ERROR: Option $1 specified more than once."
print_usage
exit 1
fi
fileSpecified=1
configFile=$2
shift
;;
-h | --help)
print_usage
exit 0
;;
--off)
if [ $authOffSpecified -eq 1 ]; then
echo
echo "***ERROR: Option $1 specified more than once."
print_usage
exit 1
fi
authOff=1
authOffSpecified=1
;;
--on)
if [ $authOnSpecified -eq 1 ]; then
echo
echo "***ERROR: Option $1 specified more than once."
print_usage
exit 1
fi
authOn=1
authOnSpecified=1
enableAuthorization=1
;;
--setup)
if [ $authOnSpecified -eq 1 ]; then
echo
echo "***ERROR: Option $1 specified more than once."
print_usage
exit 1
fi
authOn=1
authOnSpecified=1
;;
--status)
if [ $statusSpecified -eq 1 ]; then
echo
echo "***ERROR: Option $1 specified more than once."
print_usage
exit 1
fi
doStatus=1
statusSpecified=1
;;
*)
print_usage
exit 1
esac
shift
done
if [ $doStatus -eq 0 ]; then
if [ $authOn -eq 0 -a $authOff -eq 0 ]; then
echo
echo "***ERROR: Please turn authentication on (--on/--setup) or off (--off)."
print_usage
exit 1
fi
if [ $authOnSpecified -eq 1 -a $authOffSpecified -eq 1 ]; then
echo
echo "***ERROR: Cannot turn authentication both on and off, please choose one."
print_usage
exit 1
fi
fi
# display introductory messages
echo "INFO: Start of security (authentication and authorization) script $(date)."
isCluster=1
if [ "$MY_NODES" == "" ]; then
isCluster=0
fi
errorRows=0
# if turning authentication on, make sure a valid config file was specified
# and copy the configuration file to all nodes
if [ $authOn -eq 1 ]; then
setup_config
copy_config
fi
# if requested, enable authorization
if [ $enableAuthorization -eq 1 ]; then
enable_authorization
fi
if [ $authOff -eq 1 ]; then
disable_authorization
fi
if [ $errorRows -ne 0 ]; then
echo "Errors found, script terminated"
exit 3
fi
# Adjust the TRAFODION_AUTHENTICATION_CONFIG environment variable
if [ $authOn -eq 1 -o $authOff -eq 1 ]; then
change_sqenvcom
if [[ "$LDAP_SECURITY" != "Y" ]]; then
echo
echo "INFO **** IMPORTANT ***"
echo "INFO: Please start a new shell and bounce DCS in order for the authentication change to take affect"
echo
fi
else
# report the status of authentication enablement
if [ $doStatus -eq 1 ]; then
echo
echo "INFO: *** Trafodion security (authentication and authorization) status *** "
authEnabled=`echo $TRAFODION_ENABLE_AUTHENTICATION | grep "YES" | wc -l`
if [ $authEnabled -eq 0 ]; then
echo " Authentication is NOT ENABLED"
else
echo " Authentication is ENABLED"
fi
status_authorization
echo
fi
fi
echo "INFO: End of security (authorization and authentication) script $(date)."