Disallow -p no sftp

3

Temos um servidor que funciona como uma "caixa de depósito" para usuários (externos) para enviar dados para nós através do sftp / ssh. Precisamos processar esses arquivos (gpg decifrar, descompactar, etc) à medida que eles chegam. No passado, simplesmente processávamos cada arquivo no diretório pessoal de cada usuário sem considerar se já havíamos processado. Isso acabou sendo um desperdício. Eu atualizei (reescrevei) nosso script de processamento para confiar em um mecanismo como:

FILESTOPROCESS=$(find -H /home/$CUST -type f -newer /home/$CUST/marker-file)

Isso combinado com um touch /home/$CUST/marker-file funcionou muito bem e nossa carga de trabalho foi drasticamente reduzida.

Há mais ou menos um dia, tivemos um problema de configuração em nosso servidor SSH que impediu temporariamente que os usuários enviassem arquivos para nós. Quando o script foi executado novamente, ele ignorou um arquivo que o usuário inicialmente não conseguiu carregar, mas subseqüentemente fez o upload via sftp / ssh com a opção "-p", para preservar o timestamp. Isto ajustou o c / a / mtimes do arquivo para ser um dia mais ou menos do que o arquivo marcador e então foi subseqüentemente ignorado.

Eu gostaria de impedir que os usuários façam upload com "-p" para que os arquivos sejam criados com os timestamps atuais.

Posso fazer isso em sshd_config?

    
por dmourati 03.05.2013 / 23:30

4 respostas

6

Não, você não pode fazer isso na configuração. Olhando através de sftp-server.c , vejo que a única maneira de desabilitar isso é executar sftp-server no modo somente leitura, o que é inútil se você quiser permitir uploads:)

Se você não se importar em manter seu próprio pacote openssh, poderá remover as chamadas para utimes / futimes in sftp-server.c antes de compilar. Como alternativa, você pode usar uma biblioteca LD_PRELOAD com implementações noop dessas funções.

    
por 06.05.2013 / 23:11
4

Você pode usar o incond (inonify cron daemon), para disparar um script quando um arquivo é adicionado.

Se você tiver muitos arquivos enviados de uma só vez, poderá enfileirar os nomes dos arquivos a serem processados e processar os itens da fila um por um.

    
por 06.05.2013 / 23:18
2

Você disse que o ... "-p" option ... set the c/a/mtimes of the file ... - isso é incorreto, pois o ctime só pode ser definido para a hora atual alterando o inode mtime ou as permissões (ou outras configurações de inode não relevantes aqui).

Com esse conhecimento, você pode encontrar arquivos não processados usando -cnewer .

$ FILESTOPROCESS=$(find -H /home/$CUST -type f \
   \( -newer /home/$CUST/marker-file -o \
      -cnewer /home/$CUST/marker-file \) )
    
por 07.05.2013 / 14:51
1

Eu não sei se (mas eu não acho) você pode fazer isso no sshd_config. No entanto, aqui está uma ideia: E se você modificasse o script de processamento para que os arquivos entrassem em um diretório temp primeiro, você pegaria o hash (md5, talvez) do arquivo e compararia esse hash com o mesmo nome no arquivo. diretório do usuário (se tal arquivo existir).

Se o hash combinar, então não faça nada (qual é o objetivo?)

Se o hash não corresponder, copie (não mova) o arquivo do diretório temp para o local final (sem a opção -p, é claro).

    
por 06.05.2013 / 23:14