민감한 데이터를 chpasswd에 전달하기 위해 echo를 사용하는 것이 안전합니까?

민감한 데이터를 chpasswd에 전달하기 위해 echo를 사용하는 것이 안전합니까?

일괄 처리를 사용하여 일부 사용자 계정 비밀번호를 설정하려고 합니다 chpasswd. 비밀번호는 무작위로 생성되어 에 인쇄되어야 하며 stdout(적어두거나 비밀번호 저장소에 넣어야 함) 에도 전달되어야 합니다 chpasswd.

순진하게도 나는 이렇게 할 것이다

{
  echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
  echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)

그러나 새 비밀번호를 명령줄 인수로 전달하는 것이 걱정됩니다 echo. 인수는 일반적으로 에서 다른 사용자에게 표시되기 때문입니다 ps -aux(비록 echo에서는 어떤 줄도 표시되지 않지만 ps).

반환된 비밀번호 앞에 값을 추가한 다음 에 전달하는 다른 방법이 있습니까 chpasswd?

답변1

echo귀하의 코드 는 셸에 내장되어 있으므로 프로세스 테이블에 표시되지 않으므로 안전해야 합니다 .

대체 솔루션은 다음과 같습니다.

#!/bin/bash

n=20
paste -d : <( seq -f 'student%.0f' 1 "$n" ) \
           <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd

n그러면 명령을 사용하여 명령줄에 비밀번호를 전달하지 않고도 학생 이름과 비밀번호가 생성됩니다 .

paste유틸리티는 여러 파일을 열로 함께 묶고 파일 사이에 구분 기호를 삽입합니다. 여기서는 구분 기호로 사용 :하고 두 개의 "파일"(절차적 대체)을 제공합니다. 첫 번째에는 seq20개의 학생 사용자 이름을 생성하는 명령의 출력이 포함되어 있고, 두 번째에는 길이가 13인 20개의 임의 문자열을 생성하는 파이프라인의 출력이 포함되어 있습니다.

생성된 사용자 이름이 포함된 파일이 있는 경우:

#!/bin/bash

n=$(wc -l <usernames.txt)

paste -d : usernames.txt \
           <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd

secret.txt생성된 비밀번호를 터미널에 표시하는 대신 비밀번호와 사용자 이름을 파일에 저장합니다 .

답변2

echo아마도 셸에 내장되어 있으므로 ps별도의 프로세스로 표시되지 않습니다.

그러나 명령 대체를 사용할 필요는 없으며 파이프의 출력을 다음으로 직접 보낼 수 있습니다 chpasswd.

{  printf "%s:" "$username";
   head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
} | chpasswd 

한 번에 여러 개의 비밀번호를 변경하려면 chpasswd기본 부분을 쉽게 반복할 수 있어야 합니다. 아니면 함수로 바꾸세요:

genpws() {
    for user in "$@"; do
        printf "%s:" "$user";
        head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13
        echo
    done
}
genpws username1 username2... | chpasswd 

그런데: 라인 지향이 아니기 head /dev/urandom때문에 좀 이상하게 느껴집니다 . urandom너무 많은 바이트를 읽어 커널의 사용 가능한 엔트로피 개념에 영향을 미쳐 /dev/random차단이 발생할 수 있습니다. 고정된 양의 데이터를 읽고 base64임의의 바이트를 인쇄 가능한 문자로 변환하는 것과 같은 방법을 사용하는 것이 더 깔끔할 수 있습니다(얻은 바이트의 약 3/4을 버리는 대신).

이와 같은 것이 당신에게 대략적인 것을 줄 것입니다. 16자 및 숫자:

head -c 12 /dev/urandom | base64 | tr -dc A-Za-z0-9 

(즉, 의 출력에서 ​​와 문자 수를 뺍니다 +. 각 문자가 나올 확률은 1/32이므로 올바른 조합을 하면 최소 14자가 남을 확률은 약 99%, 99.99%는 입니다. 기회는 적어도 12개를 남깁니다.)/base64

관련 정보