On Fri, 15 Oct 2010 16:28:51 +0200
"Benny LC6fgren" <[email protected]> wrote:

> On 2010-10-15 00.59, Brad Tilley wrote:
> > On 10/14/2010 06:45 PM, Ben Niccum wrote:
> >>> I thought about doing that too. I need to test it more to see what
> >>> happens when ksh is the shell and the user executes csh manually.
> >>> I suppose ksh will still honor TMOUT in that case.
> >>> Brad
> >> Don't mean to complicate things for you, but just thought I should
> >> mention that if the user does:
> >> # exec /bin/csh
> >> Then csh takes over ksh's active process, and even though the TMOUT
> >> variable is still there, csh doesn't honor it, and ksh is no longer
> >> around to object.
> >> -Ben
> > Great point. That's precisely the sort of thing I'd like to have
> > thought about. Much of the compliance efforts may look good on
> > paper, but have no impact on actual usage or may be trivially
> > circumvented as you point out. So while disabling a shell may get a
> > check mark during PCI compliance efforts, that may be all you end
> > up with.
>
> You mentioned not wanting to use anything not in base.
>
> How about a simple shell script, using nothing but standard
> utilities, to regularly monitor logged-in users and kick idle ones
> out?
>
> I whipped something together as an example, se below. (Very slightly
> tested, use at your own risk :-) ) As an added bonus you can't as a
> regular user circumvent its watchful eye by exec:ing a different
> shell or simply by changing the idle timeout value in the current
> login shell.
>
>
> Regards,
> /Benny
>
> ----8<--------8<--------8<--------8<--------8<---- (cut)
> #!/bin/ksh
>
> #
> #       idlehup  --  hang up idle tty connections
> #       -------
> #
> #       Written on a whim in 2010-10-15 by Benny Lofgren
> #
> #       benny -at- internetlabbet.se / +46 70 718 11 90
> #
> #     Use at your own risk :-)
> #
> #       Run with nohup (or remove infinite loop at the end
> #     and run with cron)
> #
>
> PROG="$0"
>
> if [ $# -ne 1 ]
> then
>      echo "${PROG}: usage: ${PROG} <max_idle_time_in_minutes>"
>      exit 1
> else
>      IDLETIME=`expr $1 + 0` 2>/dev/null
>
>      if [ $? != 0 ]
>      then
>          echo "${PROG}: ERROR: idle time argument must be numeric"
>          exit 2
>      fi
>
>      if [ ${IDLETIME} -gt 1440 ]
>      then
>          echo "${PROG}: ERROR: idle time must be <= 1440 minutes (24
> h)" exit 3
>      fi
> fi
>
> getidle()
> {
>      idletime="$1"
>
>      who -u |
>      while read user tty mon day time idle rest
>      do
>          # Check each logged-in user for excessive idle times
>          isidle=false
>          case "${idle}" in
>              ".")    ;;              # Active tty, do nothing
>              old)    isidle=true;;   # Very old, kick them out
>            ??:??)    H=`echo $idle | cut -d: -f1`
>                      M=`echo $idle | cut -d: -f2`
>                      M=`expr "$H" \* 60 + "$M"`
>                      if [ "$M" -gt "$idletime" ]
>                      then
>                          isidle=true
>                      fi
>                      ;;
>          esac
>
>          # Find and eliminate session leader and the rest will follow
>          if [ "${isidle}" = "true" ]
>          then
>              ps -t`echo $tty | sed "s/^tty//"` -opid,stat |
>              while read pid stat
>              do
>                  case "$stat" in
>                      *s*) echo $pid;; # He's the leader, stone him!
>                  esac
>              done
>          fi
>      done
> }
>
> while true
> do
>      PIDS=`getidle ${IDLETIME}`
>      if [ X"${PIDS}" != X"" ]
>      then
>          kill -HUP ${PIDS}
>      fi
>
>      sleep 60
> done
> ----8<--------8<--------8<--------8<--------8<---- (cut)
>
>

As already said in this thread, there is no way to handle everything.
For example, this script does not work when a user connects with ssh
without allocating a pseudo-tty.
Still, it does not seem to be a problem for the PCI DSS ...

--
Stephane Sezer

Reply via email to