2006年1月9日 星期一

二十一億個帳號

很早以前就想到,如果有一個需要實體帳號的服務,那麼那個服務的帳號不會就受到linux帳號uid的限制了嗎?(書上說UID最大值為2^16-1),所以我也一直以為是這樣,剛剛去網路上爬了一下文,發現linux的kernel在2.3版的時候已經加入UID32-bit的支援了,所以穩定版的2.4版都已經可以容許2^32-1個帳號,也就是4294967295個帳號,於是筆者查了一下主機的核心版本是2.6.8-2-686,於是就手癢測試了一下,筆者先後使用adduser -u UID NAME的方式,新增了三個使用者

帳號名稱 uid
testuser 70000
testuser2 4200000000
testuser3 5000000000

分別測試登入,登入結果都ok
ls -la /home的結果如下

drwxr-xr-x 2 testuser testuser 4096 2006-01-08 19:41 testuser
drwxr-xr-x 2 4200000000 testuser2 4096 2006-01-08 19:40 testuser2
drwxr-xr-x 2 root staff 4096 2006-01-08 19:42 testuser3

打開/etc/passwd一看

testuser:x:70000:70000:root,,,:/home/testuser:/bin/bash
testuser2:x:2147483647:2147483647:root,,,:/home/testuser2:/bin/bash
testuser3:x:2147483647:2147483647:root,,,:/home/testuser3:/bin/bash

發現了嗎,除了testuser外其他的兩個帳號都緩衝區溢滿了,這32個bit只使用了31個bit來計算,第一個bit為正負(二的補數表示法),不知道這是bug還是有什麼特別的設計,uid應該不會有負的吧,所以實際帳號的數量是2^31-1個也就是2147483648個

補充一下
/etc/group內容如下

testuser:x:70000:
testuser2:x:4200000000:
testuser3:x:4294967295:

後話
再另一架RH9 Kernel 2.4.22-1.2115的系統上測試結果
帳號名稱 uid
testuser 4200000000
testuser1 5000000000

testuser:x:4200000000:4200000000::/home/testuser:/bin/bash
testuser1:x:4294967295:4294967295::/home/testuser1:/bin/bash

結論
看起來這像是Debian adduser程式的bug

p.s 應該沒有像我這麼無聊的人才是....
p.s2 書上的介紹應該要改一下了...