# Guia do Linux/Avançado/Restrições de acesso, recursos e serviços/Limitando recursos no bash
## Limitando recursos no bash
### Uso do comando readonly para exportar variáveis

Variáveis exportadas na forma comum podem ser modificadas a qualquer momento pelo usuário, e isso pode trazer problemas de acordo com o tipo de sistema que administramos. A definição da variável como somente leitura (readonly) evita a maioria destes problemas:
A variável TESTE não poderá ser modificada ou excluída. Com isto o administrador pode "bloquear" a modificação de variáveis que controlam o funcionamento de determinados recursos do interpretador de comandos (alguns deles serão vistos ainda nesta seção).
OBS1: Algumas variáveis de controle de ambientes ambiente do interpretador de comandos já são iniciadas com valores somente leitura (como as variáveis EUID e PPID)
OBS2: Variáveis exportadas como somente leitura em shell scripts são mantidas até a finalização do script e depois liberadas.

### Restrições nos diretórios de usuários e root

O controle de acesso a diretórios de usuários é importante quando desejamos que outras pessoas não tenham acesso ao diretório de outros usuários, violando a privacidade do mesmo e obtendo acesso a partes indesejáveis, principalmente do usuário root. É recomendado restringir o acesso somente ao dono e grupo do usuário, bloqueando o acesso a outros tipos de usuários:
O exemplo acima permitirá o acesso do diretório /root e /home/usuario somente ao usuário e grupo que pertencem. Este processo pode ser facilitado na criação dos diretórios de usuários em /home especificando a variável: DIR_MODE=0750 no arquivo /etc/adduser.conf.
OBS: Algumas distribuições de Linux garantem o acesso livre a diretórios de usuários por padrão pois alguns daemons que requerem acesso a diretório de usuários rodam sob outros usuários ao invés do root. Um bom exemplo é a utilização do recurso "UserDir" do Apache para servir requisições como http://servidor.org/~usuario.
A restrição de diretório home neste caso bloqueará o acesso do servidor web Apache ao diretório /home/usuario/public_html. Mesmo assim, uma alternativa para garantir a utilização da restrição é incluir o usuário do servidor web Apache (www-data) no grupo "usuario" (que possui acesso ao diretório /home/usuario):
Isto garantirá que o servidor Apache continue servindo as requisições dentro do diretório /home/usuario, com acesso garantido via grupo. O mesmo principio pode ser aplicado em outros programas, apenas leve em consideração que se um cracker tomar conta do processo que tem acesso ao seu diretório home restrito, ele certamente também terá acesso.

### Restrições básicas do shell bash com bash -r/--restricted, rbash

Quando o bash é iniciado com o parâmetro -r, --restricted ou como rbash, o shell restringe o uso dos seguintes recursos em sua seção:
* Usar o comando cd para mudar de diretório.
* Definindo, modificar ou apagar a variáveis SHELL, PATH, ENV, BASH_ENV.
* Nomes de comandos que contém /
* Especificar um nome de arquivo contendo uma / como argumento para o comando builtin (embutido no interpretador de comandos).
* Especificar uma / como argumento a opção -p no comando hash (embutido no interpretador de comandos).
* Importar a definição de funções do ambiente do shell atual.
* Analisar o valor da variável SHELLOPTS do ambiente do shell atual.
* Redirecionando a saída padrão usando os operadores de redirecionamento >, >|, <>, >&, &>; e >>.
* Usando o comando embutido exec para substituir o shell por outro comando.
* Usar as opções -f ou -d com o comando enable (embutido no interpretador de comandos).
* Especificar a opção -p ao comando interno command.
* Desativar o modo restrito com set r ou set o restricted *
Estas restrições são ativadas após a leitura dos arquivos de inicialização do interpretador de comandos. O shell restrito desliga as restrições quando um shell script é executado.

### Finalizando consoles inativos

A variável TMOUT determina o tempo de inatividade de um shell para que ele seja terminado.
Terminará o bash caso nenhum comando seja executado no período de 600 segundos (5 minutos). Veja [#s-d-restr-bash-readonly Uso do comando readonly para exportar variáveis, Seção 19.1.1] como complemento.

### Desabilitando o registro de comandos digitados

Todos os comandos que digitamos em uma seção do shell são registrados no arquivo ~/.bash_history, as seguintes variáveis fazem seu controle:
* HISTFILE - Nome do arquivo que armazenará o histórico de comandos. O padrão é ~/.bash_history. Caso não seja especificado, os comandos não serão gravados após finalizar o shell.
* HISTSIZE - Define o número de comandos que o arquivo de histórico poderá armazenar, o padrão é 500.
* HISTFILESIZE - Define o número máximo de linhas no arquivo de histórico.
Se você possui muitos usuários em seu sistema, é recomendado ajustar estas variáveis como somente leitura para que o usuário não desative o logging por qualquer motivo (veja [#s-d-restr-bash-readonly Uso do comando readonly para exportar variáveis, Seção 19.1.1]).

### Desabilitando serviços de shell para usuários

Existem casos onde o usuário precisa estar cadastrado no sistema mas não precisa ter acesso a uma conta de login válida (como um sistema servidor de e-mail ou outros serviços). Neste caso a desabilitação dos serviços de shell aumentará um pouco a segurança do sistema, mesmo conseguindo acesso a conta/senha estará impedido de entrar no sistema (pelo menos terá um pouco mais dificuldade para conseguir isso).
Um programa que é muito usado para desabilitar o shell exibindo uma mensagem ao usuário que fez a tentativa é o falselogin. Ele deve ser colocado como o "shell padrão" no arquivo /etc/passwd e exibirá a mensagem contida no arquivo /etc/falselogin.conf quando o login para aquele usuário for tentado. Esta operação pode ser facilitada usando a variável DSHELL=/usr/bin/falselogin no arquivo /etc/adduser.conf.
Uma forma alternativa de desativar o serviço de login de TODOS os usuários (exceto o root e os já logados no sistema) é criar um arquivo chamado /etc/nologin e colocando uma mensagem dentro dele, que será exibida quando tentarem efetuar o login no sistema.
OBS: Tome cuidado ao usar esta alternativa, este método deve ser usado somente em caso de EMERGÊNCIA, as distribuições Linux usam este método para bloquear o login de outros usuários durante o processo de inicialização, removendo assim que o processo é terminado. Esteja consciente disso.
Em alguns casos, o uso do PAM pra desabilitar os serviços de login pode ser mais adequado (veja [#s-d-restr-pam-login Restringindo/Bloqueando o login, Seção 19.2.3]).