SSH key file size 0 & NULL file generation

Words
493
Reading
3 min
Listen
Play
9y

스팀잇에는 IT 관련 글들은 별로 없지만서도 ...
하는 일이 이거다보니 그냥 저장 차원에서 쓸 내용이 생길 때마다 올릴 예정입니다.

새로운 이슈가 발생을 했습니다.

SSH로 접속을 해서 작동하는 제품인데
언젠가부터 SSH connection이 안되는 상황이 몇몇 보드에서 발생합니다.

파워를 reboot하거나 리셋을 하거나
어떤 경우에도 복구가 되지 않는 상황이 된 것입니다.

이유는 sshd 데몬의 구동시 이를 구동하는 스크립트에서
아래와 같은 구문이 수행되는데
이것이 파일의 존재여부만 검사하기 때문입니다.

if [ ! -f /etc/ssh_host_key ] ; then
echo Generating RSA Key...
/usr/bin/ssh-keygen -t rsa1 -f /etc/ssh_host_key -C '' -N ''
fi

-f 옵션은 파일이 존재하는가에 대한 것입니다.
앞에 !로 NOT 처리가 되어 있으므로
만약 파일이 존재하지 않으면 정상적으로 키를 만들게 됩니다.

문제는 어느 상황에서 아래 그림과 같이
이 파일들이 크기가 0이 되어 있는 것입니다.

image.png

아직까지는 이 문제가 왜 발생하는 지를 잘 모르겠습니다.
여러가지로 검색을 해봐도
이러한 상황이 발생했을때의 복구에 대한 얘기들만 있고
왜 발생하는지는 나와있지 않네요 ... ㅠㅠ

어쨌든 먼저 해야할 것은 복구를 시켜야 하는 것입니다.

위의 스크립트에서 파일의 존재 여부만 검사하는 것이 아니라
파일의 크기가 0인가도 비교하도록 추가해야 할 것입니다.

그래서 일단 시험을 위해서 키 파일들을
크기가 0인 것으로 만드려고 했습니다.

image.png

vi ssh_host_dsa_key를 수행해서 파일 안의 내용을 다 지웠습니다.
키 파일의 구조가 아래와 같이 그냥 텍스트이기 때문에
지울 수 있습니다.

-----BEGIN DSA PRIVATE KEY-----
MIIBuwIBAAKBgQC17gVB8lWJ4z2GPS3A6YmrkJ7DBhKXis48LpwZZqn8DxUfnMiG
b4QH9ZNnET9SIM62QkahzSKRRA6PJGuKEUUw2vRENYSpJVqbQa+pzlpXfmXA30XN
CSrQTPtFuESAUuSdGHNW2rxTz0aMNo9zu+LobN+6tyIvYqLusVXK22hUOQIVANyq
Tt4GMIs89xy/nG/yOZT614m1AoGBAJ6gs2nSGLY44Ol7wI0SkcZsBitbBHrqGAOh
L1jk0Q/gGtuUm41/VhmwkQODyaFskbiewfM0DwZBjT7DiKaVNJhW2cigQWX55GYt
S5YGFG6p7iKKZyRDyfrnjwaUKXXLxvG7Kg2EkCSuBXgp60tde6G1qb5RcoDvgXbE
6QZwOWJuAoGASzLISh6rDUBmq04tf3BZPA2tQBgp3pFcXzLoyIPKc9RmkKKWGKoN
2DbMRe4fJGQQUPWgEvCXFknERW872PC7+SjSO9XBRrsLl/nGA6rbHWOcCGg9wv4P
I9iXzlUygzU1RiLdXRsTHHj6UCvzqD+pr/yniO7vpkDEiscTffg8HzwCFCtWR06F
j/4I8OnuDGdIKjlbm4ar
-----END DSA PRIVATE KEY-----

image.png

음 ... 이렇게 하는 것은 아닌 듯 합니다.
파일의 크기가 1입니다.
0으로 만들기 위해서는 좀 다른 방법을 써야 하겠습니다.

"/dev/null"을 이용해야 합니다.

"/dev/null"은 Null Device를 의미합니다.

아래 위키 정보를 참조하면 되겠습니다.

https://en.wikipedia.org/wiki/Null_device
https://ko.wikipedia.org/wiki/%EB%84%90_%EC%9E%A5%EC%B9%98

아래와 같이 수행을 합니다.

image.png

cat /dev/null > ssh_host_dsa_key

cat을 이용해서 Null Device를 파일로 파이프 연결합니다.

image.png

이제 정상적으로 파일 크기가 0이 되었음을 확인할 수 있습니다.

이제 이를 복구하는 것을 구현해야 하겠네요.

쉘 스크립트에서 파일 크기가 0이 아닌가를 비교하는 것이 있는가 찾아 보았습니다.

-s 옵션이 있더군요.

File exists and has a size greater then zero 입니다.
즉, 파일이 존재하는데 크기가 0 이상이다.

그렇다면 -f로 검사하던 것을 그냥 -s로만 바꾸면 될 듯 합니다.

if [ ! -s /etc/ssh_host_key ] ; then
echo Generating RSA Key...
/usr/bin/ssh-keygen -t rsa1 -f /etc/ssh_host_key -C '' -N ''
fi

-s로 수정하고 구동해 보았습니다.

/etc/ssh_host_dsa_key already exists.
Overwrite (y/n)?

부팅을 진행하다가 바로 위 상태에서 멈춰 있습니다.
파일이 이미 있는데 덮어쓸까요 물어보는데
물론 덮어쓰면 되기는 하는데
문제는 부팅하면서 이렇게 사용자의 입력을 받으면 문제가 생기겠죠.

if [ ! -s /etc/ssh_host_dsa_key ] ; then
echo Delete Key file...
rm -f /etc/ssh_host_dsa_key
echo Generating DSA Key...
echo THIS CAN TAKE A MINUTE OR TWO DEPENDING ON YOUR PROCESSOR!
echo
/usr/bin/ssh-keygen -t dsa -f /etc/ssh_host_dsa_key -C '' -N ''
fi

위와 같이 파일을 지울 수 있도록 추가를 해 주었습니다.

Delete Key file...
Generating DSA Key...
THIS CAN TAKE A MINUTE OR TWO DEPENDING ON YOUR PROCESSOR!

로그 중에 위 내용을 출력하면서 정상 동작했습니다.

image.png

Key 파일도 잘 복구가 되었네요 .;;

감사합니다.

[스팀잇을 건강하게 하는 캠페인]
플랑크톤부터 함께 해보았으면 합니다

#ourselves 캠페인
셀프보팅을 하지 않고 글을 올리시고
ourselves 테그를 달아 주시면
많은 분들이 관심 가져 줄꺼에요.

#십일조 캠페인
매주 들어온 수익의 10%를
명성도가 약한 뉴비들에게 전송하는 것은 어떨까요
많은 분들이 동참해 주시면 감사하겠습니다.

SSH key file size 0 & NULL file generation | Ecency