Você deveria usar chroot. O chrootcomando altera o diretório raiz que todos os processos filho veem. Vou dar um exemplo para demonstrar como funciona.
Isso foi escrito no local; Atualmente, não estou na frente de uma máquina UNIX. Neste exemplo, há um diretório chamado dircom três arquivos: a, b, c, e ls. Os três primeiros são arquivos regulares. lsé um hardlink para o lsbinário real, para que possamos listar arquivos enquanto estiver no chroot.
Eu vou chrootem dir. (Observe que provavelmente estou esquecendo alguns diretórios no diretório raiz.)
Aqui está a configuração, no formato de saída do shell:
$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var
Agora eu vou chrootentrar dir. O /bin/bashargumento escolhe qual processo deve ser executado com o novo diretório raiz. O padrão é /bin/sh.
$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/
Agora saímos do chroot:
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
Espero que isso ilustre como o chrootcomando funciona. Basicamente, o que você precisa fazer para resolver seu problema é executar um chrootcomando como esse usuário toda vez que efetuar login. Talvez colocá-lo em um script de inicialização?
Um hardlink para um arquivo continuará a funcionar dentro de um chroot, mesmo que esse arquivo não possa ser acessado por outros meios (isso funciona porque os hardlinks apontam para inodes, não para caminhos). Portanto, para permitir ao usuário acessar, por exemplo, o mysqlcomando, você deve executar:
ln /usr/bin/mysql /path/to/chroot/target