[완료]FTP 사용자 인증에 대해서 질문을 드리겠습니다.
안녕하세요 제가 공개용 FTP소스를 보고 있는데요
소스는 4~5년 전의 것입니다.
소스에서는 사용자 인증을 passwd구조체를 읽어 들어서 거기에 password를 바로 사용하고 있습니다. 그런데 현재 리눅스에서 보면 /etc/passwd파일의 암호화 부분은"x"로 되어있져 이유는 다들 아시겠지만 아무나 passwd파일을 열어서 패스워드를 크랙할수 있기 때문에 shadow파일에 저장이 되는걸로 알고 있습니다.
공개용 소스 struct passwd { char *pw_name; /* 유저 이름 */ char *pw_passwd; /* 유저 패스워드 */ uid_t pw_uid; /* 유저 id */[code] gid_t pw_gid; /* 그룹 id */ char *pw_gecos; /* 실제 이름 */ char *pw_dir; /* 홈 디렉토리 */ char *pw_shell; /* shell 프로그램 */ } if (!guest) {/* "ftp" is only account allowed no password */ if (pw == NULL) salt = "xx"; else salt = pw->pw_passwd; /*게스트 접속이 아닐경우 salt에 pw->passwd값을 넣는다 출력해보면 "x" 가들어있다. xpasswd = crypt(passwd, salt); if (pw == NULL || *pw->pw_passwd == '\0' || strcmp(xpasswd, pw->pw_passwd)) { reply(530, "Login incorrect.");/*아래는 모두 실패했을경우*/ pw = NULL; last.failures++; if (login_attempts++ >= 5) { syslog(LOG_ERR,"REPEATED LOGIN FAILURES FROM %.100s, %s",remotehost, last.name); exit(0); } return; } }
이 비슷한 질문을 올렸을때 고마운분의 도움으로 shadow 파일을 읽어들이는 구조체를 알아냈습니다.
struct spwd *spw; spw = getspnam(pw->pw_name); if (!guest) { /* "ftp" is only account allowed no password */ if (pw == NULL) salt = "xx"; else /*salt = pw->pw_passwd; shadow file의 password 이용을 위해 수정 11.05*/ salt = spw->sp_pwdp; xpasswd = crypt(passwd, salt); /*if (pw == NULL || *pw->pw_passwd == '\0' ||strcmp(xpasswd, pw->pw_passwd)) { shadow file의 password 이용을 위해 수정 11.05*/ if (spw == NULL || *spw->sp_pwdp == '\0' || strcmp(xpasswd, spw->sp_pwdp)) { reply(530, "Login incorrect."); pw = NULL; last.failures++; if (login_attempts++ >= 5) { syslog(LOG_ERR, "REPEATED LOGIN FAILURES FROM %s, %s", remotehost, last.name); exit(0); } return; } }
그래서 첫번째 소스의 예를 2번째 소스의 예로 수정을 해서 인증이 안되는부분은 고쳤습니다.(그전에는 올바른 암호를 넣어도 실패)
제가 질문을 올리는 이유는 getspnam()을 찾아보던중 궁금증이 생겨서 입니다.
첫번째는 위의 원 오픈소스처럼 passwd파일안에 password가 shadow 파일이 아닌 passwd파일에 그대로 있었던적이 있었나요? 원소스를 보면 그대로 pw->pw_passwd을가지고 crypt()로 암호화를해서 인증받으려고 하는걸로봐선 예전에는 passwd파일에 패스워드를 암호화한 값이 있었던거 같습니다.
두번째는 조인시위키에서 getspnam()에 대한 설명입니다.
"보통 패스워드는 crypt(3) 함수를 통해서 만들어 지는데, 리눅스의 경우 더복잡한 패스워드를 만들기 위해서 crypt 후 MD5 암호화 까지 적용 한다. Solaris 와 같은 많은 Unix 운영체제는 여전히 crypt 만 적용하기도 한다."
최근에 리눅스 버젼중 md5암호화를 하는 버젼이 있는것인가요? 그렇다면 제가 수정한 2번째 소스같은경우는 인증을 못받을꺼 같아서 질문을 드립니다.
조금 질문이 이상하긴 하지만 두가지가 궁금해서 질문을 드렸습니다. 알고 계시는 분은 답변을 주시면 감사하겠습니다.^^
댓글 달기